2016-07-18 56 views
0

爲什麼TypeScript在下面不會拋出類型錯配?爲什麼TypeScript類型檢查算術運算?

undefined * 1 === NaN 

實現一個類型檢查的,將是微不足道的:

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

難道也有可能實現一個用於+操作?

+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詢問數字運算符沒有更嚴格的簽名無關 –

+0

@BartekBanachewicz正如我在回答中寫的,開發人員需要確保在getDataFromServer實現中返回一個'number',但是我試圖說明編譯器不可能知道它是否會是'number','NaN'或其他什麼東西 –

+0

嗯,那麼什麼呢?來自套接字的數據通常是鍵入爲「緩衝區」或「字符串」(您可以通過其他方式創建)。這與數學運算符的簽名有什麼關係? –