![](/img/trans.png)
[英]Property 'id' does not exist on type 'User' with Passport and Typescript
[英]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.