2017-11-19 8 views
0

と地図の使い方<>:活字体:以下の単純なクラスを考えるstrictNullChecks

class Observer { 
private subscribers: Map<string, Array<((data: any) => void)>> = new Map();  

public subscribe(event: string, callback: (data: any) => void) { 
    if (!this.subscribers.has(event)) { 
     this.subscribers.set(event, []); 
    } 

    this.subscribers.get(event).push(callback); //tsc says: Object is possibly 'undefined' 
} 

}

さらに、tsconfig.jsonで、フラグstrictNullChecksstrictが有効になっています。

subscribersは現在のイベントのキーがチェックされていますが、typescriptコンパイラは上記のエラーメッセージ(this.subscribers.get(event)はおそらく定義されていません)に苦情を返します。

私は完全に間違っていないよ場合は、this.subscribers.get(event)は、この場合にはundefinedなることはありません。

は、どのように私は、そのメッセージを取り除くことができますか?

答えて

2

型付けのMapは、明示的にgetundefinedにつながることを述べている:strictNullChecksを有効にしてエラーになっている理由

interface Map<K, V> { 
    ... 
    get(key: K): V | undefined; 
    ... 
} 

だこと。

あなたはそれが実際に価値があることを確信しているコンパイラに通知するnon-null assertion operatorを使用することができます。

this.subscribers.get(event)!.push(callback); 

別のオプション(私の意見では良い方)は次のようにあなたのコードをリファクタリングすることです:

public subscribe(event: string, callback: (data: any) => void) { 
    let callbacks = this.subscribers.get(event); 
    if (!callbacks) { 
     callbacks = [] 
     this.subscribers.set(event, callbacks); 
    } 

    callbacks.push(callback); 
} 
関連する問題