typeScripy 新增的六個類型
1.元組
元組可以看做是數組的拓展,它表示已知元素數量和類型的數組。確切地說,是已知數組中每一個位置上的元素的類型,來看例子:
let tuple: [string, number, string, boolean]
tuple = ['', 100, '', false]
tuple[1] = 200
tuple[3] = true
// 在 2.6 版本之前,TypeScript 對於元組長度的校驗和 2.6 之後的版本有所不同,我們來看下面的例子,前後版本對於該情況的處理:
// tuple = ['', 100, '', false, '']
// 不能將類型“[string, number, string, false, string]”分配給類型“[string, number, string, boolean]”。
// 屬性“length”的類型不兼容。
// 不能將類型“5”分配給類型“4”。
2.枚舉 enum
枚舉 enum 類型在 C++這些語言中比較常見,TypeScript 在 ES 原有類型基礎上加入枚舉類型,使我們在 TypeScript 中也可以給一組數值賦予名字,這樣對開發者來說較爲友好。比如我們要定義一組角色,每一個角色用一個數字代表,就可以使用枚舉類型來定義:
enum Roles {
SUPER_ADMIN,
ADMIN = 100,
USER
}
console.log(Roles[1]) // ADMIN
console.log(Roles.ADMIN) // 1
3.any
JavaScript 的類型是靈活的,程序有時也是多變的。有時,我們在編寫代碼的時候,並不能清楚地知道一個值到底是什麼類型,這時就需要用到 any 類型,即任意類型。我們來看例子:
let value: any
value = 'str'
value = false
value = null
value = undefined
value = 100
console.log(value.name)
console.log(value.toFixed())
console.log(value.length)
// 上面這些語句都不會報錯,因爲 value 是 any 類型,所以後面三個操作都有合法的情況,
// 當 value 是一個對象時,訪問 name 屬性是沒問題的;當 value 是數值類型的時候,
// 調用它的 toFixed 方法沒問題;當 value 是字符串或數組時獲取它的 length 屬性是沒問題的。
4.unknown
let un: unknown
un = 'str'
un = false
un = null
un = undefined
un = 100
// console.log(un.name) // 對象的類型爲 "unknown"。
// console.log(un.toFixed())
// console.log(un.length)
// 而當你指定值爲 unknown 類型的時候,如果沒有通過基於控制流的類型斷言來縮小範圍的話,
// 是不能對它進行任何操作的,unknown 類型的值不是可以隨便操作的。
5.void
void 和 any 相反,any 是表示任意類型,而 void 是表示沒有任意類型,就是什麼類型都不是,這在我們定義函數,函數沒有返回值時會用到:
void 類型的變量只能賦值爲 undefined 和 null,其他類型不能賦值給 void 類型的變量
const voidFun = (text: string): void => {
console.log(text)
}
// 這個函數沒有返回任何的值,所以它的返回類型爲 void。
6.never
never 類型指那些永不存在的值的類型,它是那些總會拋出異常或根本不會有返回值的函數表達式的返回值類型,
// 當變量被永不爲真的類型保護(後面章節會詳細介紹)所約束時,該變量也是 never 類型。
const errorFunc = (message: string): never => {
throw new Error(message)
}
const infiniteFunc = (): never => {
while (true) {
console.log(100)
}
}
交叉類型 (實際就是與的關係)
const merge = <T, U>(arg1: T, arg2: U): T & U => {
let res = {} as T & U // as 語法 這裏指定返回值的類型兼備 T 和 U 兩個類型變量代表的類型的特點
// let res = <T & U>{}; // 尖括號語法
res = Object.assign(arg1, arg2) // 這裏使用 Object.assign 方法,返回一個合併後的對象;
// 關於該方法,請在例子下面補充中學習
return res
}
const info1 = {
name: 'lison'
}
const info2 = {
age: 18
}
const lisonInfo = merge(info1, info2)
console.log(lisonInfo.name)
// console.log(lisonInfo.address) // error 類型“{ name: string; } & { age: number; }”上不存在屬性“address”
// 可以看到,傳入的兩個參數分別是帶有屬性 name 和 age 的兩個對象,
// 所以它倆的交叉類型要求返回的對象既有 name 屬性又有 age 屬性。
聯合類型(實際就是或的關係)
聯合類型在前面課時中幾次提到,現在我們來看一下。聯合類型實際是幾個類型的結合,但是和交叉類型不同,聯合類型是要求只要符合聯合類型中任意一種類型即可,它使用 | 符號定義。當我們的程序具有多樣性,元素類型不唯一時,即使用聯合類型。
const getLength = (content: string | number): number => {
if (typeof content === 'string') {
return content.length
} else {
return content.toString().length
}
}
console.log(getLength('abc')) // 3
console.log(getLength(123)) // 3