使用 ts-node 的 Typescript 声明合并无法按预期工作
Typescript's declaration merging not working as expected using ts-node
对于使用 express-session
包的项目,我试图通过简单地添加用户密钥来改变 session
对象。
req.session.user = 123;
来自 接受的答案,我知道我可以使用声明合并来扩展 SessionData
接口,使用我自己的接口。
查看各种开源项目,例如 HospitalRun components repository,我注意到它们在 include
部分下的 tsconfig.json
文件中有 types
目录,如下所示.
"include": [
"src",
"types"
]
我的整个 tsconfig.json
看起来像这样,它位于项目的根目录中。
{
"include": [
"types",
"src",
],
"exclude": [
"node_modules"
],
"compilerOptions": {
"lib": [
"esnext",
"esnext.asynciterable"
],
"baseUrl": ".",
"skipLibCheck": true,
"module": "commonjs",
"esModuleInterop": true,
"target": "es6",
"moduleResolution": "node",
"outDir": "build",
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"strictPropertyInitialization": false,
},
}
我试过做同样的事情,在这个文件夹(~/types/
)的根目录下有一个名为 express-session.d.ts
的文件,其内容如下:
import session from 'express-session';
declare module 'express-session' {
interface SessionData {
user: any;
}
}
然而,我一直收到的错误是这样的。
Property 'user' does not exist on type 'Session & Partial<SessionData>'
然而,当我将这段代码添加到我用于改变我的会话对象的代码之上时,我不再有问题。不过,这似乎不是正确的方法。
此外,当我使用 tsc src/index.ts --build
而不是 ts-node src/index.ts
时,它也有效。
我在这里做错了什么?这怎么能解决?我也尝试使用 typeRoots
,使用相同的文件夹。
最新更新(2021 年 5 月 8 日)
当运行使用ts-node
的打字程序时,即使在tsconfig.json中指定了typeRoots
,也无法识别自定义.d.ts和提示符Property 'x
不存在类型 y` 错误。
根据https://github.com/TypeStrong/ts-node/issues/1132#issuecomment-716642560
ts-node
的贡献者之一提出了多种解决方法。
这是其中之一:
在 tsconfig.json
中指定 file: true
标志以通知 ts-node
在启动时从 tsconfig.json
加载 files
、include
和 exclude
选项
{
"ts-node": {
"files": true
},
"exclude": [...],
"compilerOptions": {
...
}
旧:(2021 年 5 月 7 日)
不需要在tsconfig.json
中使用include
,路径不正确。编译器可以在目录及子目录下搜索ts文件
尝试删除它。并重新启动 TS 服务器。
如果你使用的是VSCode,试试Cmd + Shift + P 或 Ctrl + Shift + P 并搜索 Restart TS server
并查看用户类型错误仍然存在
{
"exclude": [
"node_modules"
],
"compilerOptions": {
"lib": [
"esnext",
"esnext.asynciterable"
],
"baseUrl": ".",
"skipLibCheck": true,
"module": "commonjs",
"esModuleInterop": true,
"target": "es6",
"moduleResolution": "node",
"outDir": "build",
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"strictPropertyInitialization": false,
},
}
对于使用 express-session
包的项目,我试图通过简单地添加用户密钥来改变 session
对象。
req.session.user = 123;
来自 SessionData
接口,使用我自己的接口。
查看各种开源项目,例如 HospitalRun components repository,我注意到它们在 include
部分下的 tsconfig.json
文件中有 types
目录,如下所示.
"include": [
"src",
"types"
]
我的整个 tsconfig.json
看起来像这样,它位于项目的根目录中。
{
"include": [
"types",
"src",
],
"exclude": [
"node_modules"
],
"compilerOptions": {
"lib": [
"esnext",
"esnext.asynciterable"
],
"baseUrl": ".",
"skipLibCheck": true,
"module": "commonjs",
"esModuleInterop": true,
"target": "es6",
"moduleResolution": "node",
"outDir": "build",
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"strictPropertyInitialization": false,
},
}
我试过做同样的事情,在这个文件夹(~/types/
)的根目录下有一个名为 express-session.d.ts
的文件,其内容如下:
import session from 'express-session';
declare module 'express-session' {
interface SessionData {
user: any;
}
}
然而,我一直收到的错误是这样的。
Property 'user' does not exist on type 'Session & Partial<SessionData>'
然而,当我将这段代码添加到我用于改变我的会话对象的代码之上时,我不再有问题。不过,这似乎不是正确的方法。
此外,当我使用 tsc src/index.ts --build
而不是 ts-node src/index.ts
时,它也有效。
我在这里做错了什么?这怎么能解决?我也尝试使用 typeRoots
,使用相同的文件夹。
最新更新(2021 年 5 月 8 日)
当运行使用ts-node
的打字程序时,即使在tsconfig.json中指定了typeRoots
,也无法识别自定义.d.ts和提示符Property 'x
不存在类型 y` 错误。
根据https://github.com/TypeStrong/ts-node/issues/1132#issuecomment-716642560
ts-node
的贡献者之一提出了多种解决方法。
这是其中之一:
在 tsconfig.json
中指定 file: true
标志以通知 ts-node
在启动时从 tsconfig.json
加载 files
、include
和 exclude
选项
{
"ts-node": {
"files": true
},
"exclude": [...],
"compilerOptions": {
...
}
旧:(2021 年 5 月 7 日)
不需要在tsconfig.json
中使用include
,路径不正确。编译器可以在目录及子目录下搜索ts文件
尝试删除它。并重新启动 TS 服务器。
如果你使用的是VSCode,试试Cmd + Shift + P 或 Ctrl + Shift + P 并搜索 Restart TS server
并查看用户类型错误仍然存在
{
"exclude": [
"node_modules"
],
"compilerOptions": {
"lib": [
"esnext",
"esnext.asynciterable"
],
"baseUrl": ".",
"skipLibCheck": true,
"module": "commonjs",
"esModuleInterop": true,
"target": "es6",
"moduleResolution": "node",
"outDir": "build",
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"strictPropertyInitialization": false,
},
}