声明与ES6样式模块合并

时间:2016-01-28 14:53:59

标签: typescript

我想在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;。也许这是某种程度上的问题,因为命名空间嵌套?

你如何正确地做到这一点?

4 个答案:

答案 0 :(得分:1)

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

从v1.8起,可以使用模块扩充。语法与环境声明相同(正如您在问题中所示) - 唯一的区别是您上面发布的内容现在可以正常工作。

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

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

declare global {
    interface Array<T> {
        popFromTop(): T;
    }
}

答案 1 :(得分:0)

显然,编译器问题会导致此问题:

https://github.com/Microsoft/TypeScript/issues/6722

希望很快就会解决这个问题。

答案 2 :(得分:0)

我想在这里加2美分;  这就是我将id属性添加到Request

的方法
  1. 定义.d.ts文件的任何位置;它将包含在整个项目中共享的自定义类型我通常称之为index.d.ts 您将无法从此文件中的模块导入类型(因为它是环境声明文件)。在这个例子中:
  2. <强> index.d.ts

    interface Identificable {
      id: number
    }
    
    1. 在您的打字稿文件中,像往常一样导入请求并定义一个同时应用Request和您的类型的新类型。
    2. <强> 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版本,它运行良好。