想想 Typescript 中的以下代碼行:
let x: 'a' | 'b' extends 'a' ? true : false;
我想知道 的型別x是真的,因為直觀地'a' | 'b'是 的擴展版本'a'(至少我的直覺是這樣說的)。我認為擴展會像數學中的子集一樣作業。A extends B如果B ? A。
然而,似乎實際型別x是false在這里。我想我不明白extends關鍵字究竟是如何作業的。
uj5u.com熱心網友回復:
擴展檢查實體的型別,不檢查可能的變數。即使它有效,對于類這樣的復雜型別也沒有任何意義。如果你用 String 來檢查它會是真的。
let x: ('a' | 'b') extends String ? true : false;
輸出將是;
true
您可以從https://www.typescriptlang.org/docs/handbook/2/conditional-types.html查看有關條件型別的檔案
uj5u.com熱心網友回復:
根據Liskov 替換原則,如果Yextends X,則Y可以在任何需要 an 的地方使用符合型別的值X。這導致了一個違反直覺的陳述:當提到可能值的范圍時,Y它比X以下更受約束:所有Ys 都是X,但并非所有Xs 都是Ys。
在您的示例中,因為'a' | 'b'可能是'a'或'b',該值不會擴展 type 'a',因為'b'不會替代'a'. 相反,'a' extends ('a' | 'b'),因為所有匹配的值'a'都適用于'a' | 'b'。
因此,A extends Biff A ? B。
這在 TypeScript 中不太直觀的一個原因是我們在這里討論的是文字值。對于我們來說,從物件的角度考慮這個可能更有意義,其中{foo: number, bar: number}擴展{foo: number}。后者,{foo: number},可以具有bar任何型別的屬性或根本沒有bar。前者{foo: number, bar: number}更具體,也更受約束:不僅是foo一個數字,而且bar還是一個數字。
這也是為什么never可分配給所有內容:never是最受約束的型別,因為沒有實際值與其匹配,因此never擴展了所有內容。空集是每個集的子集,因此空型別never是每個型別的子型別,并且可以分配給其他所有型別。
type Foo = { foo: number };
type Bar = never extends Foo ? true : false; // true
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/401766.html
標籤:javascript 打字稿 类型
