You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript声明文件未正常编译引发运行报错的排查与解决

问题:Express.User类型扩展后ts-node运行时报错TS2339

问题场景

自定义扩展了Express的User接口,让它继承Prisma生成的Users类型,IDE中代码无错误提示,但使用ts-node启动应用时,出现类型错误:error TS2339: Property 'id' does not exist on type 'User'.

相关文件与配置

自定义类型定义文件 src/config/passport/lib.d.ts

import { Users } from '@prisma/client';

declare global {
    namespace Express {
        interface User extends Users {}
    }
}

Passport序列化代码 src/config/passport/passport.ts

passport.serializeUser((user, done) => {
    done(null, user.id);
});

tsconfig.json配置

{
  "compilerOptions": {
    "target": "es2016",                                
    "lib": ["es6"],                                    
    "module": "commonjs",                              
    "rootDir": "src",                                  
    "resolveJsonModule": true,                         
    "allowJs": true,                                   
    "outDir": "build",                                 
    "esModuleInterop": true,                       
    "forceConsistentCasingInFileNames": true,           
    "strict": true,                                    
    "noImplicitAny": true,                             
    "skipLibCheck": true                          
  }
}

文件路径

  • src/config/passport/passport.ts
  • src/config/passport/lib.d.ts

解决方法

问题出在ts-node的启动参数上:

  • 原启动脚本:ts-node ./src/index.ts
  • 修改后启动脚本:ts-node --files ./src/index.ts

原因:ts-node默认仅处理入口文件及直接依赖的文件,不会自动加载所有类型定义文件。添加--files参数后,ts-node会加载tsconfig中配置的所有文件,包括自定义的.d.ts类型扩展文件,这样运行时就能识别到扩展后的Express.User类型,从而正确解析user.id的类型。

内容的提问来源于stack exchange,提问作者Mopcho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 15:50:19