Node內置IncomingMessage的DefinitelyTyped定義(參數(req, res, next)
中的req類型)定義了url
to be nullable。這裏的定義文件的剪斷部分:如何在Typescript中覆蓋屬性爲非空值
// @types/node/index.d.ts
declare module "http" {
export interface IncomingMessage {
/**
* Only valid for request obtained from http.Server.
*/
url?: string;
}
}
正如評論說,這是因爲這個屬性是唯一有效的,當你得到從http.Server這IncomingMessage的一個實例。在其他用途中,它不會存在,因此它可以爲空。
但是,就我而言,我知道我知道,我只是從http.Server獲取這些實例,所以這有點令人討厭,我不能在沒有額外的守衛的情況下訪問該屬性。
import { IncomingMessage, ServerResponse } from 'http';
function someMiddleware(req: IncomingMessage, res: ServerResponse, next: Function) {
const myStr: string = req.url; // bzzzt.
// Argument of type 'string | undefined' is not
// assignable to parameter of type 'string'.
}
這可能是很好的一提的是我使用TS 2.0.3與strictNullChecks
,這是不是在Typescript Playground啓用。
下面是問題。 是否有可能在我的應用程序中覆蓋該定義,以使url
不可空?
這是我已經嘗試過......加上這對我的文件之一:
declare module 'http' {
interface IncomingMessage {
url: string;
}
}
......當然,這是不允許的:「隨後的變量聲明必須有相同的類型」。 This is explained in the documentation.
我可以迄今想到的唯一的事情就是創建自己的模塊,它的進口,延伸,然後導出接口:
// /src/http.ts
import { IncomingMessage as OriginalIM } from 'http';
export interface IncomingMessage extends OriginalIM {
url: string;
}
// src/myapp.ts
import { IncomingMessage } from './http'; // <-- local def
function someMiddleware(req: IncomingMessage) {
const str: string = req.url; // all good
}
所以,這個工作,但似乎錯了。