Paw*_*ski 11 types ambient typescript nrwl
我的新 NX 工作区中有一个基本设置
两者都是使用 nx cli 命令创建的:即nx g @nrwl/node:lib some-lib --simpleModuleName=true
对于库,我想使用环境声明文件(.d.ts)。我在/libs/some-lib/src/types/index.d.ts中添加了一个,内容为:
declare type MyCustomType = any;
Run Code Online (Sandbox Code Playgroud)
据我了解,该文件是根据/libs/some-lib/tsconfig.lib.json文件进行处理的,但我还在/libs/some-lib/tsconfig.json中添加了对此文件的直接引用:
{
"extends": "../../../tsconfig.base.json",
"files": [
"src/types/index.d.ts"
],
"include": [
"src/types/**/*.d.ts"
],
"references": [
{
"path": "./tsconfig.lib.json"
},
{
"path": "./tsconfig.spec.json"
}
]
}
Run Code Online (Sandbox Code Playgroud)
当我在 lib 代码中使用此文件时,我的 IDE 很高兴,例如: /libs/some-lib/src/lib/file.ts
export const x: MyCustomType = 1;
Run Code Online (Sandbox Code Playgroud)
但是如果我想将此变量导入到my-app中并运行它(nxserve my-app),
import { x } from '@my-workspace/some-lib';
Run Code Online (Sandbox Code Playgroud)
我从编译器得到一个错误:
ERROR in libs/some-lib/src/lib/file.ts
TS2304: Cannot find name "MyCustomType".
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,有没有一种方法可以在库内使用环境声明文件,并且在运行从此库导入抽象的应用程序时不会出现错误?
我可以在根文件夹中创建共享类型:*types/myCustomType.d.ts",然后将其包含在应用程序和库的文件属性中的 tsconfigs 中,但我不想避免它并保持类型靠近代码。
另一个可行但丑陋的解决方案是在 my-app 的 tsconfig 文件中添加对库的额外引用:
{
"path": "../../libs/some-lib/tsconfig.json"
}
Run Code Online (Sandbox Code Playgroud)
结果/apps/my-app/tsconfig.json:
{
"extends": "../../tsconfig.base.json",
"files": [],
"include": [],
"references": [
{
"path": "./tsconfig.app.json"
},
{
"path": "./tsconfig.spec.json"
},
{
"path": "../../libs/node/schedulers/tsconfig.json"
}
]
}
Run Code Online (Sandbox Code Playgroud)
或者创建一个tsconfig.json桶:/libs/tsconfig.json ...并在那里引用相关库。my-app 的 tsconfig 文件只需要引用这个单个文件。
为所有类型创建根目录types/
为应用程序和库创建子目录
types/lib-a/types/lib-b/types/app-a/无需将这些类型添加到tsconfig.base.json. typeRoots将所有 tsconfig 文件恢复为默认值,然后在每个库和应用程序的文件中添加tsconfig.json。还包括它所依赖的库的 typeRoots。
libs/lib-a/tsconfig.lib.json{
...
"compilerOptions": {
"typeRoots": ["../../../types/lib-a/"]
},
...
}
Run Code Online (Sandbox Code Playgroud)
libs/lib-b/tsconfig.lib.json{
...
"compilerOptions": {
"typeRoots": ["../../../types/lib-b/"]
},
...
}
Run Code Online (Sandbox Code Playgroud)
apps/app-a/tsconfig.app.json还可以在此处添加依赖库的类型{
...
"compilerOptions": {
"typeRoots": [
"../../../types/lib-a/",
"../../../types/app-a/"
]
},
...
}
Run Code Online (Sandbox Code Playgroud)