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.
- Ved å bruke normal Javascript
import jsModule=require('npm_js_module'); - Lag en dummydefinisjon for modulen din og inkluder den manuelt.
- 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..
