我想在Express的id
界面中添加一个属性Request
。 Express具有DefinitelyTyped类型定义。我已尝试过各种方式指定合并接口,所有这些都会导致错误或无法正常工作。
我正在使用ES6样式模块导入访问Express的打字:import * as express from 'express';
我尝试与Request
命名空间中的Express
对象合并。
declare module Express {
export interface Request {
id: number;
}
}
这无声无息。我已经尝试使用实际的模块而不是命名空间,遵循我正在使用的新1.8编译器的说明:
import { Request } from 'express';
declare module 'express' {
interface Request {
id: number;
}
}
此错误是因为Module augmentation cannot introduce new names in the top level scope.
当我打开实际的express.d.ts
文件时,看起来module e { ... }
包含所有接口,declare module "express" { ... }
内包含一行export = e;
。也许这是某种程度上的问题,因为命名空间嵌套?
你如何正确地做到这一点?
答案 0 :(得分:1)
在v1.8之前的TypeScript版本中,这是不允许的。
从v1.8起,可以使用模块扩充。语法与环境声明相同(正如您在问题中所示) - 唯一的区别是您上面发布的内容现在可以正常工作。
模块扩充允许您扩展全局和模块范围。
要扩展全局范围,您可以使用global
作为三个模块名称:
declare global {
interface Array<T> {
popFromTop(): T;
}
}
答案 1 :(得分:0)
答案 2 :(得分:0)
我想在这里加2美分;
这就是我将id
属性添加到Request
.d.ts
文件的任何位置;它将包含在整个项目中共享的自定义类型我通常称之为index.d.ts
您将无法从此文件中的模块导入类型(因为它是环境声明文件)。在这个例子中:<强> index.d.ts 强>
interface Identificable {
id: number
}
Request
和您的类型的新类型。 <强> handler.ts 强>
import { Request, Response } from 'express'
type IdentificableRequest = Request & Identificable
function myHandler(req: IdentificableRequest, res: Response) {
const id = req.id // fine
const params = req.params // fine too
...
}
答案 3 :(得分:0)
我的问题是在package.json
"typescript": "2.0.3"
我有read_csv
,在系统上我安装了2.3.3版本。
我删除了2.3.3版本并安装了2.0.3版本,它运行良好。