2016-07-14 2 views
1

のは、私はこのようなコードがあるとしましょう:活字体strictNullChecksとクロージャ

function f(x: string | undefined) { 
    if (x) { 
     console.log(x); 
     Promise.resolve() 
      .then(() => g(x)) // error, x is string | undefined 
    } 

    // x = undefined; 
} 

function g(y: string) { 
} 

型ガードとしてif (x)行為、そうxconsole.logstringを入力しています。しかし、.thenのクロージャから参照される場合、そのタイプはstring | undefinedです。 .thenのコードが実行される前に、型ガードの外側で値が未定義に戻ってしまう可能性があるからです。しかし、もしそれが再び設定されなければ、Typescriptはそれを検出させるような種類の分析をしてはならない。

x!演算子を使用して回避することができます。しかし、私はコードベースでこの種のことをしばしば行い、xを未定義にすることで後で壊れることから保護しません。

他の方法がありますか?問題を正しく理解していますか?

私はあなたがこれらのいずれかを行うことができると思います

答えて

3

(1)使用のconst:

function f(x: string | undefined) { 
    if (x) { 
     const x2 = x; 
     Promise.resolve().then(() => g(x2)); 
    } else { 
     // x = undefined; 
    } 
} 

(2)約束の前にg()を呼び出します。

function f(x: string | undefined) { 
    if (x) { 
     let y = g(x); 
     Promise.resolve().then(() => y); 
    } else { 
     // x = undefined; 
    } 
} 
+0

1 - グッド実際には、const参照を持っているわけではありません。新しい参照があり、 'string'と入力するだけです。だから、 'let'と' var'も動作します。しかし、いくつかの混乱につながる。 2 - 確かに、私は思っているシナリオでそれをすることはできません。そうでなければ私は既に:) –

+0

ええ、あなたはconst部分について正しいと思いますが、私は関数のparamに入れようとしましたが、許可されていないので、varに変更することなく関数の本体にコピーしました/ let。 –