接口 vs 類(lèi)型別名

類(lèi)型別名會(huì)給一個(gè)類(lèi)型起個(gè)新名字。類(lèi)型別名有時(shí)和接口很像,但是可以作用于原始值,聯(lián)合類(lèi)型,元組以及其它任何你需要手寫(xiě)的類(lèi)型。
type Name = string;type NameResolver = () => string;type NameOrResolver = Name | NameResolver;function getName(n: NameOrResolver): Name {if (typeof n === 'string') {return n;}else {return n();}}
起別名不會(huì)新建一個(gè)類(lèi)型,只是創(chuàng)建了一個(gè)新名字來(lái)引用那個(gè)類(lèi)型。給原始類(lèi)型起別名通常沒(méi)什么用,只是一種使用形式。
同接口一樣,類(lèi)型別名也可以是泛型,我們可以添加類(lèi)型參數(shù)并且在別名聲明的右側(cè)傳入:
type Container<T> = { value: T };我們也可以使用類(lèi)型別名來(lái)在屬性里引用自己:
type Tree<T> = {value: T;left: Tree<T>;right: Tree<T>;}
然而,類(lèi)型別名不能出現(xiàn)在聲明右側(cè)的任何地方。
type Yikes = Array<Yikes>; // error像我們提到的,類(lèi)型別名可以像接口一樣;然而,仍有一些細(xì)微差別。
另一個(gè)重要區(qū)別是類(lèi)型別名不能被 extends 和 implements(自己也不能 extends 和 implements 其它類(lèi)型)。因?yàn)?軟件中的對(duì)象應(yīng)該對(duì)于擴(kuò)展是開(kāi)放的,但是對(duì)于修改是封閉的,你應(yīng)該盡量去使用接口代替類(lèi)型別名。
字符串字面量類(lèi)型允許你指定字符串必須的固定值。在實(shí)際應(yīng)用中,字符串字面量類(lèi)型可以與聯(lián)合類(lèi)型,類(lèi)型保護(hù)和類(lèi)型別名很好的配合。通過(guò)結(jié)合使用這些特性,你可以實(shí)現(xiàn)類(lèi)似枚舉類(lèi)型的字符串。
type Easing = "ease-in" | "ease-out" | "ease-in-out"評(píng)論
圖片
表情
