簡體   English   中英

TypeScript中泛型的行為

[英]Behavior of Generics in the TypeScript

我想稍微學習一下TS,並且正在關注官方頁面

我在泛型章節

從指南:

function identity(arg: any): any {
    return arg;
}

他們聲明如下:

雖然使用any肯定是通用的,因為它將導致函數接受arg類型的任何類型和所有類型,但實際上,我們丟失了有關函數返回時該類型的信息 如果我們傳入一個數字,則唯一的信息就是可以返回任何類型。

現在讓我們觀察這段代碼:

let whatIsMyType = identity(666);
typeof whatIsMyType; // number

我沒有丟失類型信息。 他們指的是哪種損失?

進一步閱讀,指南建議使用T型,如:

function identity<T>(arg: T): T {
    return arg;
}

附帶說明:

現在,我們向身份函數添加了類型變量T。 此T允許我們捕獲用戶提供的類型(例如,數字),以便我們以后可以使用該信息。 在這里,我們再次使用T作為返回類型。 通過檢查,我們現在可以看到參數和返回類型使用相同的類型。 這使我們能夠將鍵入信息的信息投放到函數的一側,而另一端則從其中流出。

最后:TS中的功能(具有任何類型的簽名)

function identity(arg: any): any {
    return arg;
}

以及具有通用類型T的函數:

function identity<T>(arg: T): T {
return arg;

}

一旦編譯為普通的JS,它們看起來都是相同的:

function identity(arg) {
    return arg;
}

現在,我了解了預警的好處,也了解了任何簽名。 我不明白為什么說我丟失了類型,我應該使用“ T”簽名代替。

這更復雜,並且基本上是相同的。

現在讓我們觀察這段代碼:let whatIsMyType = identity(666); whatIsMyType的類型; //數字我還沒有丟失類型信息。 他們指的是哪種損失?

它涉及靜態類型信息和運行時類型信息之間的差異。 TypeScript都是關於靜態類型信息的,TypeType編譯器可以使用該信息來幫助您保持程序代碼正確。 但是typeof (在這種情況下)是一種運行時操作,它告訴您在變量上使用typeof時在運行時變量whatIsMyType中存儲了哪種值。

如果將代碼粘貼到操場上,然后將鼠標懸停在whatIsMyType變量上,則會看到它的類型為any ,這意味着您可以在對identity的調用之后為它高興地分配"foo"

function identity(arg: any): any {
    return arg;
}
let whatIsMyType = identity(666);
console.log(whatIsMyType);
whatIsMyType = "foo";          // No error here
console.log(whatIsMyType);

出於所有目的和目的,變量的類型類似於JavaScript變量。

TypeScript的目標是存在靜態類型檢查。 對於靜態類型檢查無用(或由於第三方集成而可能實現)的那些情況(確實存在,但很少見), any都有效。

一旦編譯為普通的JS,它們看起來都是相同的:

那就對了。 TypeScript使用的靜態類型信息不是最終輸出的一部分。 這是編譯時的事情,而不是運行時的事情。 但是請注意使用泛型是如何改變的—如果您在操場上運行以下代碼:

function identity<T>(arg: T): T {
    return arg;
}
let whatIsMyType = identity(666);
console.log(whatIsMyType);
whatIsMyType = "foo";       // <== Error: Type '"foo"' is not assignable to type 'number'.
console.log(whatIsMyType);

...您可以看到,將whatIsMyType "foo"現在是編譯時錯誤。


¹ “ .. typeof (在這種情況下...)...”有點令人困惑,您可以在TypeScript中使用靜態的typeof關鍵字,該關鍵字可以在需要輸入類型的地方使用,這與JavaScript的運行時typeof關鍵字(在您的示例中使用)不同。 在TypeScript中,在變量聲明中的某些位置,例如,在:之后有一個類型類型上下文 ):

let a: type_expected_here;

...以及其他需要值的地方( 值上下文 ),例如賦值的右側:

a = value_expected_here;

如果在類型上下文中使用typeof ,則它是TypeScript的typeof運算符。 例如,如果您有以下聲明:

let foo: number = 42;

...您可以使用typeof bar聲明一個類型與foo相同的變量, 如下所示

let a: typeof foo;

由於使用typeof是期望的類型 ,因此a將具有類型number因為那是foo的類型。 如果你改變foo的聲明,所以這是一個字符串,而不是, a的類型將改變跟風。

相反:

let a = typeof foo;

那里, typeof值上下文中 ,因此它是JavaScript的運行時typeof關鍵字,並且a將獲得值(而非類型) "number" (在該特定示例中, a 's的類型推斷為string ,因為這就是JavaScript的含義) typeof的結果始終是)。

乍一看似乎很令人困惑,但隨着時間的推移會變得更加清晰。

可悲的是,文檔中沒有很好地描述TypeScript的typeof :-|


請注意,以上所有內容都是從TypeScript角度來看的。 是否找到靜態類型檢查幫助或障礙取決於您。 :-)但是出於這個答案的目的,我假設使用TypeScript透視圖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM