声明与ES6样式模块合并

Dav*_*fer 8 typescript

我想id在Express的Request界面中添加一个属性.Express具有DefinitelyTyped类型定义.我已经尝试过各种方式指定合并接口,所有这些都会导致错误或无法正常工作.

我正在使用ES6样式模块导入访问Express的打字: import * as express from 'express';

我已经尝试与命名空间中的Request对象合并Express.

declare module Express {
    export interface Request {
        id: number;        
    }
}
Run Code Online (Sandbox Code Playgroud)

这无声无息.我尝试使用实际模块而不是命名空间进行合并,遵循我正在使用的新1.8编译器的说明:

import { Request } from 'express';

declare module 'express' {
    interface Request {
        id: number;        
    }    
}
Run Code Online (Sandbox Code Playgroud)

这个错误是因为 Module augmentation cannot introduce new names in the top level scope.

当我打开实际express.d.ts文件时,看起来有一个module e { ... }包含所有接口的内部,declare module "express" { ... }其中包含一行export = e;.也许这是某种程度上的问题,因为命名空间嵌套?

你怎么做到这一点?

Fen*_*ton 1

在 v1.8 之前的 TypeScript 版本中这是不允许的。

从 v1.8 开始,模块增强可用。语法与环境声明相同(如您在问题中所示) - 唯一的区别是您上面发布的内容现在应该可以工作。

模块扩充允许您扩展全局和模块范围。

要扩展全局范围,您可以使用global三个模块名称:

declare global {
    interface Array<T> {
        popFromTop(): T;
    }
}
Run Code Online (Sandbox Code Playgroud)