增强护照 .js 的用户类型

Augmenting User type for passport.js

提问人:qnilab 提问时间:5/2/2023 更新时间:5/4/2023 访问量:132

问:

我正在尝试使用正确的用户键入护照.js。

Passport 在此处将用户界面定义为 Express 命名空间中的空接口:https://github.com/DefinitelyTyped/DefinitelyTyped/blob/22f314360cf1f8c273e9985748519cb07984dc79/types/passport/index.d.ts#L20

因此,开箱即用,当然,如下所示的代码会产生错误“属性'id'在类型'User'上不存在”:

passport.serializeUser(function(user, cb) {
  process.nextTick(function() {
    cb(null, user.id);
  });
});

这是有道理的。

我设法通过进行类型合并来避免错误:在.d.ts文件中,我有:

// express_augmentation.d.ts

declare namespace Express {
  interface User {
    id: string
  }
}

这很好用。

但是,如果不是手动指定用户具有 id(可能还有电子邮件和其他属性),而是想使用具有 id 的 User 类,该怎么办?

我正在考虑做一些事情:

// express_augmentation.d.ts

declare namespace Express {
  import MyUser from '../models/user';
  interface User extends MyUser {}
}

但这似乎行不通。我有点难住了。知道我做错了什么吗?

TypeScript Express 命名空间 Passport:.js

评论


答:

0赞 qnilab 5/4/2023 #1

啊,问题是导入失败了 - 尽管 tsc 和 VSCode 都没有突出显示这个问题。

这有效:

declare namespace Express {
  type MyUser = import('../models/user').default;
  interface User extends MyUser {}
}

出于某种原因,其行为与导入默认导出的常规应用代码不同。我必须说我不熟悉这个结构,我必须阅读它。import MyUser from '../models/user';... = import(...).default

最后,代码可以进一步压缩为:

declare namespace Express {
  type User =  import('../models/user').default;
}