javascript - Hvordan bruke untyped JS NPM-moduler i TypeScript for node?


Jeg har nettopp begynt å eksperimentere med TypeScript, og jeg har følgende prosjektstruktur:

-src
| index.ts
| MyClass.ts
-node_modules
 -npm_js_module
 | index.js
 | utils.js
 - src
  | someModuleFile.js
  | someModuleFile2.js

Jeg trenger å bruke funksjoner fra npm_js_module/index.js (og fra pm_js_module/src, men disse kreves av index.js) i MyClass.ts. Dette modulet er utypet og har ingen tilgjengelig typing på nettet fra noen andre. Er det i det hele tatt mulig å bruke et utypet JavaScript NPM-modul i et TypeScript-prosjekt?

Når jeg prøver å kompilere dette prosjektet får jeg denne feilen:

error TS6059: File '/node_modules/npm_js_module/index.js' is not under 'rootDir' '/src'. 'rootDir' is expected to contain all source files.
error TS6059: File '/node_modules/npm_js_module/utils.js'' is not under 'rootDir' '/src'. 'rootDir' is expected to contain all source files.

Min tsconfig.json ser slik ut:

{
  "compilerOptions": {
    "moduleResolution": "node",
    "module": "commonjs",
    "target": "es2017",
    "outDir": "./bin",
    "rootDir": "./src",
    "sourceMap": true,
    "allowJs" : true,
    "baseUrl" : "./",
    "paths": {
      "*" : ["./node_modules/@types/*", "*"]
    }
  },
  "files": [
    "./node_modules/@types/node/index.d.ts",
    "./node_modules/npm_js_module/index.js"
  ],
  "include": [
    "src/**/*.ts",
    "./node_modules/npm_js_module/*"
  ],
  "exclude": [
    "./node_modules"
  ]
}

og package.json slik:

{
  "name": "myproject",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@types/node": "^8.0.30"
  },
  "dependencies": {
    "npm_js_module": "^1.2.3"
  }
}

Jeg bruker denne metoden for å importere den modulen: import * as mymodule from 'npm_js_module'; hvor VScode viser denne feilen i koden: Property 'login' does not exist on type '(loginData: any, options: any, callback: any) => void'. og når jeg prøver å kompilere, er det feil som jeg skrev ovenfor.

Svar #1

Det er ikke helt klart, men det er begravet i dokumentasjonen:

Moduler

Hvis du ruller ned, vil du se en seksjon merket: export=og import=require()

Når man importerer en modul ved bruk av export =, må TypeScript-spesifikk import module=require("module") brukes for å importere modulen.

Og det viser et eksempel:

import zip = require("./ZipCodeValidator");

Håper dette hjelper.

Svar #2

Vel, det er 3 mulige løsninger på problemet ditt.

  1. Ved å bruke normal Javascript import jsModule=require('npm_js_module');
  2. Lag en dummydefinisjon for modulen din og inkluder den manuelt.
  3. BESTE MÅTE: Lag den riktige definisjonen og gjør en pull request til det offisielle depotet.

Den første løsningen bør fungere for deg, bare krev den som en vanlig node.js-modul. (Hvis du bruker den nyeste versjonen av node 8.5, vil du kunne bruke ES6 importstil ved å aktivere det spesielle flagget node --experimental-modules main.mjs), men jeg anbefaler det ikke siden det ikke er ferdigstilt..

Relaterte artikler