【发布时间】:2020-02-05 03:57:13
【问题描述】:
我目前正在研究如何在 TypeScript 中增强外部模块,阅读官方文档和肯定类型指南,检查示例等等。我现在的目标是向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>。
我已经把所有的代码都放在了这个repo,这样任何愿意帮助的人都可以重现这个错误。
【问题讨论】:
标签: node.js typescript