包括第三方库的类型会导致无法通过 angular CLI 找到模块?
Including typings for third-party library gives module not found via angular CLI?
我正尝试在我的 Angular 9 应用程序中包含 Apple 的 MapKit JS 类型,因为图书馆没有提供高质量的类型,[=16= 中也没有任何好的第三方类型] 作用域包。但是,Angular CLI 对我输入的内容不满意。我在编译时收到的确切错误是:
Module not found: Error: Can't resolve 'mapkit' in `components/map.component.ts`.
我做错了什么?
打字
~src/types/mapkit/index.d.ts
这是声明类型的地方,以及它们是如何声明的。
declare module 'mapkit' {
// interfaces, classes, etc here
}
打字稿配置
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"
]
}
代码中的用法
下面是mapkit
的用法。
import * as mapkit from 'mapkit';
长话短说:您需要用类型重命名文件夹并将它们添加到类型根目录中。
第 1 步
在类型 (./types) 的文件夹中创建新文件夹“apple-mapkit-js”
第 2 步
在此处添加您的自定义 index.d.ts
步骤#3
将 TSC 指向您的自定义类型。使用新类型根更新 tsconfig.app.json:
{
"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"
],
}
步骤 #4
将您的导入更新到
import * as mapkit from 'apple-mapkit-js'
现在可以了。
但问题是什么?
实际上,根据 TypeScript documentation,如果您指定 typeroots,则所有其他资源对于 typescript 都变得“不可见”,所以 tsc 只是没有看到您的声明
P.S。检查 Angular 9 应用程序。
尝试改为声明命名空间
declare namespace mapkit {
并从组件中删除导入
import * as mapkit from 'mapkit'; //Not needed
由于tsconfig.app.json
已经包含了您项目中的定义文件,您的命名空间声明无需进一步更改即可使用
"include": [
"src/**/*.d.ts"
],
我正尝试在我的 Angular 9 应用程序中包含 Apple 的 MapKit JS 类型,因为图书馆没有提供高质量的类型,[=16= 中也没有任何好的第三方类型] 作用域包。但是,Angular CLI 对我输入的内容不满意。我在编译时收到的确切错误是:
Module not found: Error: Can't resolve 'mapkit' in `components/map.component.ts`.
我做错了什么?
打字
~src/types/mapkit/index.d.ts
这是声明类型的地方,以及它们是如何声明的。
declare module 'mapkit' {
// interfaces, classes, etc here
}
打字稿配置
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"
]
}
代码中的用法
下面是mapkit
的用法。
import * as mapkit from 'mapkit';
长话短说:您需要用类型重命名文件夹并将它们添加到类型根目录中。
第 1 步
在类型 (./types) 的文件夹中创建新文件夹“apple-mapkit-js”
第 2 步
在此处添加您的自定义 index.d.ts
步骤#3 将 TSC 指向您的自定义类型。使用新类型根更新 tsconfig.app.json:
{
"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"
],
}
步骤 #4 将您的导入更新到
import * as mapkit from 'apple-mapkit-js'
现在可以了。
但问题是什么?
实际上,根据 TypeScript documentation,如果您指定 typeroots,则所有其他资源对于 typescript 都变得“不可见”,所以 tsc 只是没有看到您的声明
P.S。检查 Angular 9 应用程序。
尝试改为声明命名空间
declare namespace mapkit {
并从组件中删除导入
import * as mapkit from 'mapkit'; //Not needed
由于tsconfig.app.json
已经包含了您项目中的定义文件,您的命名空间声明无需进一步更改即可使用
"include": [
"src/**/*.d.ts"
],