增强外部 TypeScript 模块



我目前正在研究如何在 TypeScript 中扩充外部模块,阅读官方文档和 DefinitelyTyped 指南,检查示例等。我现在的目标是将自定义属性添加到express.Request接口(例如实现给定User接口的user

如下所示:

// types/express/index.d.ts
declare namespace Express {
export interface Request {
user: types.User;
}
}

用户界面在单独的声明文件中声明:

// types/core.d.ts
declare namespace types {
interface User {
name: string;
}
}

使用代码是具有两种方法的控制器:

// controller.ts
import { Request, Response, NextFunction } from "express";
const user = { name: "Hiago" };
class UserController {
getUser(req: Request, res: Response, next: NextFunction) {
req.user = user;
return next();
}
returnUser(req: Request, res: Response) {
const { user } = req;
return res.status(200).json(user);
}
}

这工作得很好。问题是,由于我只有命名空间声明,因此无法在代码中导入这些接口。将来,我想自动生成如上所示User的界面,并能够在应用程序的其他部分中使用它们。

所以我发现声明一个module,如下所示,可以帮助我实现这一目标:

// types/core.d.ts
declare module "core" {
export namespace types {
export interface User {
name: string;
}
}
}

现在,我可以在任何需要的地方使用import { types } from "core"导入User接口。但奇怪的是,尽管从未抱怨过types/express/index.d.ts文件中的任何内容,但在我controller.ts编译器给了我一个error TS2339: Property 'user' does not exist on type 'Request<ParamsDictionary>

我已将所有代码都放在此存储库中,以便任何愿意提供帮助的人都可以重现此错误。

将//types/express/index.d.ts 更改为:

import { types } from "core";
declare module 'express' {
interface Request {
user: types.User;
}
}

在 controller.ts 中,您使用的是模块 express 的类型,而不是命名空间。(在某些情况下,他们只是将其再导出,但似乎明示并非如此(。通过此更改,它应该可以工作。

最新更新