javascript - Typescript 的声明合并使用 ts-node 无法按预期工作
问题描述
对于使用该express-session
包的项目,我试图session
通过简单地添加用户密钥来改变对象。
req.session.user = 123;
来自这个问题的接受答案,我知道我可以使用声明合并来扩展SessionData
接口,使用我自己的接口。
查看各种开源项目,例如HospitalRun 组件存储库,我注意到它们的文件中的types
目录如下所示。tsconfig.json
include
"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,
},
}
我尝试做同样的事情,express-session.d.ts
在这个文件夹的根目录中调用一个文件 ( ~/types/
),具有以下内容:
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 日)
使用 运行 typescript 程序时ts-node
,即使typeRoots
在 tsconfig.json 中指定,也无法识别自定义 .d.ts 并提示Property 'x
不存在 type y` 错误。
根据https://github.com/TypeStrong/ts-node/issues/1132#issuecomment-716642560
ts-node
提出多种解决方法的贡献者之一。
这是其中之一:指定file: true
标志tsconfig.json
以通知ts-node
加载files
,include
以及启动时的exclude
选项tsconfig.json
{
"ts-node": {
"files": true
},
"exclude": [...],
"compilerOptions": {
...
}
旧:(2021 年 5 月 7 日)
不需要使用include
in tsconfig.json
,路径不正确。编译器可以搜索目录和子目录下的ts文件
尝试删除它。并重新启动 TS 服务器。
如果你用的是VSCode,试试++或者++ Cmd,搜索Shift一下,看看用户类型错误是否依然存在PCtrlShiftPRestart 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,
},
}
推荐阅读
- google-apps-script - 基于时间的触发器不适用于附加用户
- powershell - 如何在 powershell 脚本中使用 Get-clipboard 输出?
- python - 在熊猫数据框列中查找非数字值
- processing - 使用处理进行图像可视化:像素颜色阈值
- java - Java 如何使用 Timer 进行小游戏
- c - C90 中的 fscanf 逗号分隔
- html - 需要我的悬停状态才能使导航栏变大
- micropython - RDFlib 是否可用于 micropython?
- javascript - [].$ 在 JavaScript 中是什么意思?
- ruby-on-rails - Friendly_id 不工作版本 5.3 rails 6