[英]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.