2016-11-01 47 views
1

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 
} 

所以,這個工作,但似乎錯了。

回答

1

所以我找到了一個解決方案,就是稍微有些不好意思。

打字稿2.0還增加了一個non-null assertion operator!

function someMiddleware(req: IncomingMessage) { 
    const str1: string = req.url; // error, can't assign string | undefined to string 
    const str2: string = req.url!; // works 
} 

對我來說,它仍然是一個有點惱人,因爲有需要訪問這個屬性許多不同的文件,所以這非空斷言在很多地方使用。