2017-07-19 17 views
2

次の例では、この部分がコンパイルされないのはなぜですか?なぜこのコードはtypescriptでコンパイルされませんか?

"|| this.greeting != "test2""

class Greeter { 
    greeting: string; 
    constructor(message: string) { 
     this.greeting = message; 
    } 
    setGreeting(g) { 
     this.greeting = g; 
    } 
    test() { 
     if(this.greeting != "test" || this.greeting != "test2"){ 
      //this.greeting cound still be test3 
     } 
    } 
} 

Link to example

+0

インタプリタのバグのようですが、演算子を '&&'に変更すると、JavaScriptが生成されている途中でエラーが消えてしまいます。 –

+0

typescriptがこれを選択してエラーにフラグを立てるのはすばらしいことですが、共通の基底を持つ2つのリテラル型に対して、 "Operatorは適用できません"というエラーを、より意味のあるメッセージに置き換えることができます。常に真実 "(または"真実ではないかもしれない) "であり、この疑問につながった混乱の種類を減らすことができます。 – Duncan

答えて

6

それは実際に有効なエラーだし、間違いを犯してからあなたを防ぎます。

if (this.greeting != "test" || this.greeting != "test2") { 

あなたが||を使用しているので、第二の条件this.greeting == 'test'ない限りを実行されません。
typescriptは、2番目の条件ブロックに入るときに、this.greeting'test'と自動的に入力するほどスマートです。

明らかに、'test' != 'test2'は偽になることはありませんし、あなたの全体のif文が常にリターン真なるためには、その状態をチェックするために、おそらく間違いです。

はおそらく書きたかった:

if (this.greeting != "test" && this.greeting != "test2") { 
1

あなたが|| this.greeting != "test2"一部に達した時点では、コンパイラはthis.greeting必見"test"することを確実に知っているので、それがにthis.greetingの種類を狭めますリテラルタイプ"test"です。"test2"とは比較できません。

関連する問題