類型別名
類型別名用來給一個類型起個新名字。
type Name = string;
type NameResolver = () => string;
type NameOrResolver = Name | NameResolver;
function getName(n: NameOrResolver): Name {
if (typeof n === 'string') {
return n;
} else {
return n();
}
}
上例中,我們使用 type 創(chuàng)建類型別名。
字符串字面量類型
字符串字面量類型用來約束取值只能是某幾個字符串中的一個。
type EventNames = 'click' | 'scroll' | 'mousemove';
function handleEvent(ele: Element, event: EventNames) {
// do something
}
handleEvent(document.getElementById('hello'), 'scroll'); // 沒問題
handleEvent(document.getElementById('world'), 'dbclick'); // 報錯,event 不能為 'dbclick'
// index.ts(7,47): error TS2345: Argument of type '"dbclick"' is not assignable to parameter of type 'EventNames'.
上例中,我們使用 type 定了一個字符串字面量類型 EventNames,它只能取三種字符串中的一種。
注意,類型別名與字符串字面量類型都是使用 type 進(jìn)行定義。
元組
元組(Tuple)合并了不同類型的對象
例子: 定義一對值分別為 string 和 number 的元組:
let xcatliu: [string, number] = ['Xcat Liu', 25];
當(dāng)直接對元組類型的變量進(jìn)行初始化或者賦值的時候,需要提供所有元組類型中指定的項;其他情況可以只賦值一個元素。
枚舉
枚舉用于取值被限制在一定范圍內(nèi)的場景,枚舉使用 enum 關(guān)鍵字來定義:
enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
枚舉成員會被賦值為從 0 開始遞增的數(shù)字,同時也會對枚舉值到枚舉名進(jìn)行反向映射。
枚舉項的值也可以手動賦值,未手動賦值的枚舉項會接著上一個枚舉項遞增。
enum Days {Sun = 7, Mon = 1, Tue, Wed, Thu, Fri, Sat};
注:當(dāng)有相同值的時候,后面賦值的會覆蓋前面的。