繁体   English   中英

TypeScript + Express + Passport.js - 用户类型上不存在属性 ID

[英]TypeScript + Express + Passport.js - Property id does not exist on type User

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

问题

我试图告诉 Passport.js 将用户属性id保存到 session 中以进行进一步的身份验证,但我无法找到一种方法来告诉 TypeScript user的属性id确实存在。

passport.serializeUser((user, done) => {
  done(undefined, user.id); // Property 'id' does not exists on type 'User' 
});

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

  // src/custom-typings/index.d.ts
  namespace Express {
    interface User {
      id?: number;
    }
  }

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

src/core/passport.ts:38:24 - error TS2339: Property 'id' does not exist on type 'User'.

38   done(undefined, user.id);
                          ~~

    at createTSError (C:\Users\fvg\Desktop\Proyectos\passport-local-example\node_modules\ts-node\src\index.ts:513:12)
    at reportTSError (C:\Users\fvg\Desktop\Proyectos\passport-local-example\node_modules\ts-node\src\index.ts:517:19)
    at getOutput (C:\Users\fvg\Desktop\Proyectos\passport-local-example\node_modules\ts-node\src\index.ts:752:36)
    at Object.compile (C:\Users\fvg\Desktop\Proyectos\passport-local-example\node_modules\ts-node\src\index.ts:968:32)
    at Module.m._compile (C:\Users\fvg\Desktop\Proyectos\passport-local-example\node_modules\ts-node\src\index.ts:1056:42)
    at Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
    at Object.require.extensions.<computed> [as .ts] (C:\Users\fvg\Desktop\Proyectos\passport-local-example\node_modules\ts-node\src\index.ts:1059:12)
    at Module.load (internal/modules/cjs/loader.js:985:32)
    at Function.Module._load (internal/modules/cjs/loader.js:878:14)
    at Module.require (internal/modules/cjs/loader.js:1025:19)

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

{
  "compilerOptions": {
    "target": "es5",                       
    "module": "commonjs",                   
    "lib": ["es6"],
    "outDir": "dist",                   
    "rootDir": "src",                         
    "strict": true,                  
    "typeRoots": ["./src/custom-typings", "./node_modules/@types"],                     
    "esModuleInterop": true,
    "experimentalDecorators": true,     
    "emitDecoratorMetadata": true,       
    "resolveJsonModule": true,        
    "skipLibCheck": true,              
    "forceConsistentCasingInFileNames": true
  }
}

这是我的项目结构:

.
├── src
│   ├── core
│   │     └── passport.ts
│   │  
│   │
│   ├── custom-typings
│   │             └── index.d.ts
│   │
│   └── other stuff
│ 
│
├── tsconfig.json

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

将任何“类型”传递给用户属性

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

希望这有帮助

使用 model 中定义的用户 class 代替它应该有 id。 您还可以将 id 替换为您的用户类型中的任何其他唯一标识符。

 passport.serializeUser((user: User, done) => { done(undefined, user.id); });

  • 使用安装@types/passport
     npm install --save @types/passport
  • 之后打开index.d.ts文件,在 declare global function 中有一个接口 User object。只需在其中添加您想要的任何变量,例如
    declare global { namespace Express { // tslint:disable-next-line:no-empty-interface interface AuthInfo {} // tslint:disable-next-line:no-empty-interface interface User { *username:string; yourVariable: any; id:number; etc* } } }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM