網站搜尋

javascript - 為什麼我們在 Typescript 中需要 any 類型?


我開始學習 TypeScript。我在想,如果每個變數在沒指定類型的情況下都算是一種「any」,那我們為什麼還需要 any 類型呢。

例如,這些程式碼的輸出無論 x 和 y 的值為何,都會是是。

var x = "d";
var y: any = 5 ;
alert(y);
y = x ;
alert(y);
if (x===y) 
  alert("yes");
else
  alert("no");

答案#1

any 類型是一個逃生出口——它允許你有效地 關閉 Typescript 的類型檢查。有時候,根本沒有一個好方法告訴 Typescript 你正在做什麼,所以你使用 any 來解決這個問題。

當你省略類型註解時,類型不一定是 any —— 在許多情況下,Typescript 會 推斷 一個類型,然後強制執行該類型。let x=2; 會推斷 x 的類型為 number —— 之後如果使用 x="cat"; 就會產生錯誤。在這種情況下,如果你想這樣使用,就必須使用 any 。

還有其他情況,你必須明確使用 any,不能僅僅“省略”,例如,對於泛型類型時:

type Pair<A, B> = [A, B];

declare function needsSomethingPairedWithString(value: Pair<any, string>): void;

對於這個 needsSomethingPairedWithString 函數,我們不在乎這個 pair 的第一個元素是什麼——也許我們會測試它的類型,也許我們甚至不會用它,無所謂,但重點是我們不在乎。然而,我們想要指定 Pair 的第二個元素是 string。所以我們需要寫 Pair<any, string> 來表示這一點。

在許多情況下,對於這類用途使用 unknown 比 any 更為可取——unknown 的意思比 any 更接近「不知道也不在乎」。然而,特別是在處理約束條件時,any 可能是正確的類型。

最後,請注意存在 --noImplicitAny 編譯器標誌:這會導致那些被推斷為 any 類型的情況成為錯誤。這會迫使你要麼修正以正確推斷類型,要麼標註正確的類型,或者至少明確標註 any 類型。對於從一開始就使用 Typescript 的專案,這是 強烈建議 的——隱式 any 應該保留給那種逐步將 Javascript 轉換為 Typescript 的專案,因為它可能是許多錯誤的來源。使用 --noImplicitAny 會迫使你明確使用 any,這意味著對於之後閱讀代碼的開發者來說,any 的使用將立即顯而易見。這很重要,因為 any 意味著事情不會像你希望的那樣安全。

答案#2

如果每個變數都是某種「任何類型」,我假設如果你沒有指定類型

這是真的,但如果你使用標誌 --noImplicitAny 執行 TypeScript,那麼 TypeScript 在大多數情況下將不再假設變數應該具有 any 類型,例如。

function foo(x) {
    // x is of type any
}

上述在 --noImplicitAny 模式下會產生錯誤。因此,如果在這種特定情況下你希望 x 為 any,你就必須明確地要求它:

function foo(x: any) {
    // x is of type any
}