typescript - Inkludering av typings for tredjepartsbibliotek gir modul ikke funnet via Angular CLI?
Jeg prøver å inkludere typings for Apples MapKit JS i min Angular 9-applikasjon, fordi det ikke finnes typings av høy kvalitet levert av biblioteket, og heller ingen gode tredjeparts typings i @types-pakken. Imidlertid er ikke Angular CLI fornøyd med hvordan jeg har inkludert mine typings. Den nøyaktige feilen jeg mottar ved kompilering er:
Module not found: Error: Can't resolve 'mapkit' in `components/map.component.ts`.
Hva gjør jeg galt?
Skriving
~src/types/mapkit/index.d.ts
Dette er hvor typene erklæres, og hvordan de erklæres.
declare module 'mapkit' {
// interfaces, classes, etc here
}
Typescript-konfigurasjon
tsconfig.json
{
"compileOnSave": false,
"compilerOptions": {
"baseUrl": "./",
"outDir": "./dist/out-tsc",
"sourceMap": true,
"declaration": false,
"downlevelIteration": true,
"experimentalDecorators": true,
"module": "esnext",
"moduleResolution": "node",
"importHelpers": true,
"target": "es2015",
"typeRoots": [
"node_modules/@types"
],
"lib": [
"es2019",
"dom"
]
},
"angularCompilerOptions": {
"fullTemplateTypeCheck": true,
"strictInjectionParameters": true
}
}
tsconfig.app.json
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "./out-tsc/app",
"types": []
},
"files": [
"src/main.ts",
"src/polyfills.ts"
],
"include": [
"src/**/*.d.ts"
],
"exclude": [
"src/test.ts",
"src/**/*.spec.ts"
]
}
Bruk i kode
Slik brukes mapkit.
import * as mapkit from 'mapkit';
Svar #1
Kort fortalt: Du må gi nytt navn til mappen din med typer og legge dem til i typerøttene.
Trinn #1
I mappen din med typer (./types) opprett en ny mappe «apple-mapkit-js»
Trinn #2
Legg til din tilpassede index.d.ts der
Trinn #3 Pek TSC til dine egendefinerte typer. Oppdater tsconfig.app.json med nye typeRoots:
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "./out-tsc/app",
"typeRoots" : ["./src/types/", "node_modules/@types"]
},
"files": [
"src/main.ts",
"src/polyfills.ts"
],
"include": [
"src/**/*.d.ts"
],
}
Trinn #4 Oppdater importen din til
import * as mapkit from 'apple-mapkit-js'
Nå fungerer det.
Men hva var problemet?
Faktisk, ifølge TypeScript-dokumentasjonen, hvis du spesifiserer typeroots, blir alle andre ressurser «usynlige» for TypeScript, så tsc så rett og slett ikke dine deklarasjoner
P.S. Sjekket på Angular 9-appen.
Svar #2
Prøv å erklære et navneområde i stedet
declare namespace mapkit {
og fjern importen din fra komponenten din
import * as mapkit from 'mapkit'; //Not needed
Siden tsconfig.app.json allerede inkluderer definisjonsfiler fra prosjektet ditt, vil navneromsdeklarasjonen din fungere uten ytterligere endringer
"include": [
"src/**/*.d.ts"
],
