在我的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_modules
和npm 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.ts
将import * as core from "express-serve-static-core"
解析为我的小扩充并完全跳过了真实内容的加载。我不知道为什么,因为我确实安装了node_modules/@types/express-serve-static-core
文件夹。
它可能是什么?
答案 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
声明文件的方式上存在差异。但是,如果你按照这个例子,事情应该适合你。