TypeScript模块扩充会覆盖原始模块吗?

时间:2016-11-07 00:39:13

标签: typescript

在我的Node.js / Express应用程序中,我已经使用Headers.ts文件了很长一段时间了:

type HttpHeader = 'X-My-Header' | 'X-My-Other-Header' | 'X-Another';

declare module 'express-serve-static-core' {
    import * as http from 'http';
    interface Request extends http.IncomingMessage, Express.Request {
        header(name: HttpHeader): string | undefined;
    }
}

用于编译正常,但是,在最近的rm -rf node_modulesnpm install之后,我收到了很多错误,例如

error TS2339: Property 'get' does not exist on type 'Request'.
error TS2339: Property 'end' does not exist on type 'Response'.

似乎核心问题是node_modules/@types/express/index.d.tsimport * as core from "express-serve-static-core"解析为我的小扩充并完全跳过了真实内容的加载。我不知道为什么,因为我确实安装了node_modules/@types/express-serve-static-core文件夹。

它可能是什么?

1 个答案:

答案 0 :(得分:4)

从:

判断
import * as http from 'http';

在你的模块声明中,你实际上并不是在写一个模块" agumentation"你想要的,而是替换现有的模块。

为了编写模块扩充,您需要将其编写为:

import { Request} from 'express-serve-static-core';
import * as http from 'http';

export type HttpHeader = 'X-My-Header' | 'X-My-Other-Header' | 'X-Another';

declare module 'express-serve-static-core'{
    export interface Request extends http.IncomingMessage, Express.Request {
        header(name: HttpHeader): string | undefined;
    }
}

首先要注意的是,它应该是我的外部文件"模块(它应该有导入和导出)。

需要注意的第二件事是,import * as http应该超出模块扩充范围内部是不合法的。

声明的模块现在严格地用作扩充。它不会覆盖或替换现有的express-server-static-core模块。事实上,该模块需要存在才能进行扩充(如果拼错了它不能编译的模块名称,例如)。

我无法从您的示例中看出为什么您的代码之前有效。也许在以前实现express-server-static-core声明文件的方式上存在差异。但是,如果你按照这个例子,事情应该适合你。