交叉類型
- 格式: type1 & type2 & ...
- 交叉類型是將多個(gè)類型合并為一個(gè)類型
let mergeFn = <T, U>(arg1: T, arg2: U): T & U => {
let res = {} as T & U
res = Object.assign(arg1, arg2)
return res
}
let res = mergeFn({ name: 'cs' }, { age: 11 })
console.log('res', res)
聯(lián)合類型
- 格式: type1 | type2 | ...
- 聯(lián)合類型是多個(gè)類型中的任意一個(gè)類型
// 聯(lián)合類型
let value: string | number
value = 'abc'
value = 123
}
類型保護(hù)
- 對(duì)于聯(lián)合類型的變量,在使用時(shí)如何確切告訴編譯器他是哪一種類型
- 主要有類型斷言和類型保護(hù)
let getRandomValue = (): string | number => {
let num = Math.random()
return num >= 0.5 ? 'abc' : 123.3
}
// 無法得知res1返回值類型
let res1 = getRandomValue()
console.log('res1', res1)
- 方式一
- 雖然類型斷言可以確切告訴編譯器當(dāng)前的變量是什么類型
- 但是每一次使用的時(shí)候都需要手動(dòng)告訴編譯器, 這樣比較麻煩
if ((res1 as string).length) {
console.log((res1 as string).length)
} else {
console.log((res1 as number).toFixed())
}
- 方式二
- 定義一個(gè)類型保護(hù)函數(shù), 這個(gè)函數(shù)的返回類型是布爾類型
- 這個(gè)函數(shù)的返回值是, 傳入的參數(shù) + is 具體類型
function isString(value: string | number): value is string {
return typeof value === 'string'
}
if (isString(res1)) {
console.log((res1 as string).length)
} else {
console.log((res1 as number).toFixed())
}
- 方式三
- 使用 typeof 來實(shí)現(xiàn)類型保護(hù)
- 如果使用 typeof 來實(shí)現(xiàn)類型保護(hù), 那么只能使用 === 或者 !==
- 如果使用typeof 來是實(shí)現(xiàn)類型保護(hù), 那么只能保護(hù) number/ string/ boolean/ symbol類型
if (typeof res1 === 'string') {
console.log((res1 as string).length)
} else {
console.log((res1 as number).toFixed())
}
- 可以通過typeof來是來實(shí)現(xiàn)類型保護(hù)以外, 我們可以使用 instance
class Person {
name: string = 'css'
}
class Animal {
age: number = 12
}
let getRandomObject = (): Person | Animal => {
let num = Math.random()
return num >= 0.5 ? new Person() : new Animal()
}
let obj = getRandomObject()
console.log('obj', obj)
if (obj instanceof Person) {
console.log(obj.name)
} else {
console.log(obj.age)
}
}