使用 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 加载 filesincludeexclude 选项

{
  "ts-node": {
    "files": true
  },
  "exclude": [...],
  "compilerOptions": {
   ...
}

旧:(2021 年 5 月 7 日)

不需要在tsconfig.json中使用include,路径不正确。编译器可以在目录及子目录下搜索ts文件

尝试删除它。并重新启动 TS 服务器。

如果你使用的是VSCode,试试Cmd + Shift + PCtrl + 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,
    },
}