2016-07-18 11 views
0

TypeScriptが以下のようなタイプミスマッチを投げないのはなぜですか?TypeScript型の算術演算がチェックされないのはなぜですか?

(n : number, m : number) => number 

が、また+オペレータのための1つを実装することが可能になります:

undefined * 1 === NaN 

それは些細なことでしょうのために型チェックを実装しますか?

+0

しかし、 'undefined * 1'は有効なjavascript文ですが、なぜコンパイラに問題がありますか? –

+0

@NitzanTomer確かに、個人的にはTypeSciptがNaNを生成しないようにしたいと思っています。 – Kriegslustig

+0

原因... Javascript :( – Ray

答えて

1

TypescriptはJavaScriptのスーパーセットとして定義されています。その操作を制限することは、TSでそうでなければ有効なJSコードを使用することを禁じます。

ので、名前に「数でない」一方で、特殊なケースのようなものです確かに、しかし、個人的に私はTypeSciptが今までのNaN

NaNを生産するから私を防ぐために試してみたいと思い、それNumber型の領域にあります(主にIEEE-754実装の根底にあるためです)。いずれにしても、必要な/希望する場合は、独自のより厳密な型(例:折り返し番号)を作成できます。

0

あなたは、コンパイラに基づいてNaN値を取得に対して本当に安全ガードは、ここでの例ですができません。

function mul(x: number, y: number): number { 
    return x * y; 
} 

function getDataFromServer(): Promise<number> { 
    // async request which returns a number 
} 

getDataFromServer().then(num => mul(num, 2)); 

コンパイラは、サーバーが返すものを知る方法はありません。
数値の文字列表現("2")の場合もありますが、それは"internal server error"である場合もあります。
実行時にコード内でそれらのものをチェックできますが、コンパイラはそれを静的に認識できません。

+1

申し訳ありませんが、これがどのように答えているのかわかりません。getDataFromServerを実装すると、返されたサーバーが何か数値を生成するか、または約束のエラーを通知する必要があります。コンパイラがそれを静的にどのように表しているのかOPより厳しい署名をしていない数値演算子を求めるOPとは関係ありません –

+0

@BartekBanachewicz私の答えで書いたように、開発者は 'getDataFromServer' 'number'を返しますが、コンパイラが'数値 '、' NaN'かどうかなどを知ることができないことを示しています。 –

+0

ソケットからのデータは通常、 "バッファ"または "文字列"(これは他の手段で作成することができます)とタイプされています。それは数学演算子の署名と何が関係していますか? –

関連する問題