2017-11-16 28 views
0

「を未定義」はだから私はtypescriptです2.5.3と次のコードにvscodeで午前:私はコンパイルしようとすると、何らかの理由でラインheaders.forEach(reqHeaders.set.bind(reqHeaders))は、ヘッダの値であることを不平を言っている、オブジェクトは、おそらく

export function isHttpHeaders (headers: HttpHeaders | undefined): 
headers is HttpHeaders { 
    return !!headers && !!headers.get && !!headers.set 
} 

function headersToHeadersSpec (options?: RequestOptionsArgs): 
Headers | undefined { 

    const { headers } = options as RequestOptionsArgs 

    if (isHttpHeaders(headers)) { 
    const reqHeaders = new Headers() 
    headers.forEach(reqHeaders.set.bind(reqHeaders)) 
    return reqHeaders 
    } else { 
    return undefined 
    } 
} 

おそらく未定義です。型ガードは値が未定義でないことを保証するべきではありませんか?

+0

をあなたは、定義HttpHeaders' 'には' undefined'がないことを確認タイプHttpHeaders =アレイ<...> 'のようなものです| undefined' –

+0

@julesRandolph HttpHeadersはインターフェイスであり、多くのオプションのプロパティがあります。 –

+0

私はあなたが使用するインターフェースとクラスをローカルで定義したわずかに変更されたバージョンで再現できませんでした。 –

答えて

1

エラーはHttpHeadersの定義に由来します。これは、オプションのメンバーとしてforEachを設定しています。

エラーを修正するには、単にラベル - それは非オプション?取り除くことによって:

interface HttpHeaders { 
    get?: string 
    set?: string 
    forEach (Function): void 
} 
0

option?を意味すると、を意味するパラメータはオプションです。optionsは未定義です。値をチェックする他の関数にコードがあっても、typescriptはそのコードを見て、それが何をしているかを知るほどスマートではありません。あなたのコードはコンパイル時には安全ではありませんが、実行時には安全です。

+0

しかし、typeguardはifステートメントでブール値を返し、ヘッダーの値をキャストする必要があります。ブロック内でこの値が予期しない未定義の値であることがわかっているのは正しいですか? –

+0

ええ、それはランタイムチェックです。他の誰かがそれを打破するかどうか分からないので、常に良いコーダーとして実行する必要があります。しかし、コンパイル時には安全ではありません。すなわち、コンパイラはコードが何をしているかを知らないので、定義されていないと考えます。 –

関連する問題