TypeScript + Express + Passport.js - User 类型上不存在属性 id

how*_*ode 9 node.js typescript passport-local passport.js

我是 TypeScript 的新手,我在一个只是为了练习而制作的小应用程序中使用 Passport.js 实现了用户身份验证。

\n

问题

\n

我试图告诉 Passport.js 将用户属性保存id到会话中以进行进一步身份验证,但我只是找不到一种方法来告诉 TypeScript 该id属性user存在。

\n
passport.serializeUser((user, done) => {\n  done(undefined, user.id); // Property 'id' does not exists on type 'User' \n});\n
Run Code Online (Sandbox Code Playgroud)\n

该参数user显示为类型Express.User,但它实际上是 TypeOrm 实体的实例User。通过搜索帖子,我发现我可以扩展类型Express.User以添加​​我需要使用的属性:

\n
  // src/custom-typings/index.d.ts\n  namespace Express {\n    interface User {\n      id?: number;\n    }\n  }\n
Run Code Online (Sandbox Code Playgroud)\n

这样做可以消除编码时的错误警告,但是当我尝试编译代码时,错误再次出现,但在我的 VSCode 终端中!

\n
src/core/passport.ts:38:24 - error TS2339: Property 'id' does not exist on type 'User'.\n\n38   done(undefined, user.id);\n                          ~~\n\n    at createTSError (C:\\Users\\fvg\\Desktop\\Proyectos\\passport-local-example\\node_modules\\ts-node\\src\\index.ts:513:12)\n    at reportTSError (C:\\Users\\fvg\\Desktop\\Proyectos\\passport-local-example\\node_modules\\ts-node\\src\\index.ts:517:19)\n    at getOutput (C:\\Users\\fvg\\Desktop\\Proyectos\\passport-local-example\\node_modules\\ts-node\\src\\index.ts:752:36)\n    at Object.compile (C:\\Users\\fvg\\Desktop\\Proyectos\\passport-local-example\\node_modules\\ts-node\\src\\index.ts:968:32)\n    at Module.m._compile (C:\\Users\\fvg\\Desktop\\Proyectos\\passport-local-example\\node_modules\\ts-node\\src\\index.ts:1056:42)\n    at Module._extensions..js (internal/modules/cjs/loader.js:1157:10)\n    at Object.require.extensions.<computed> [as .ts] (C:\\Users\\fvg\\Desktop\\Proyectos\\passport-local-example\\node_modules\\ts-node\\src\\index.ts:1059:12)\n    at Module.load (internal/modules/cjs/loader.js:985:32)\n    at Function.Module._load (internal/modules/cjs/loader.js:878:14)\n    at Module.require (internal/modules/cjs/loader.js:1025:19)\n
Run Code Online (Sandbox Code Playgroud)\n

我确实将自定义类型添加到了 tsconfig.json 中:

\n
{\n  "compilerOptions": {\n    "target": "es5",                       \n    "module": "commonjs",                   \n    "lib": ["es6"],\n    "outDir": "dist",                   \n    "rootDir": "src",                         \n    "strict": true,                  \n    "typeRoots": ["./src/custom-typings", "./node_modules/@types"],                     \n    "esModuleInterop": true,\n    "experimentalDecorators": true,     \n    "emitDecoratorMetadata": true,       \n    "resolveJsonModule": true,        \n    "skipLibCheck": true,              \n    "forceConsistentCasingInFileNames": true\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的项目结构:

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 core\n\xe2\x94\x82   \xe2\x94\x82     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 passport.ts\n\xe2\x94\x82   \xe2\x94\x82  \n\xe2\x94\x82   \xe2\x94\x82\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 custom-typings\n\xe2\x94\x82   \xe2\x94\x82             \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 index.d.ts\n\xe2\x94\x82   \xe2\x94\x82\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 other stuff\n\xe2\x94\x82 \n\xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tsconfig.json\n
Run Code Online (Sandbox Code Playgroud)\n

所有其他解决方案都说这是解决这个典型问题的方法,但我就是无法使其工作,我错过了什么?

\n

Red*_*daz 0

使用模型中定义的 User 类,而不是应该有 id 的类。您还可以将 id 替换为用户类型中的任何其他唯一标识符。

passport.serializeUser((user: User, done) => {
  done(undefined, user.id); 
});
Run Code Online (Sandbox Code Playgroud)