- 聯合類型
|
,是求并集
type A = {
name:string
}
type B = {
age:number
}
type C = A | B
const p1:C = {
name: 'frank'
}
const p2:C = {
age: 18
}
// p3 處于兩者交集當中,可以理解為p3有name屬性,所以是屬于A類型的。
const p3:C = {
name:'frank',
age:18
}
-
注意:
image.png - 針對聯合類型,有時需要進行類型收窄才能繼續
-
typeof a === 'xxx'
:只能判斷基本類型以及function
-
arr instanceof Array
:不能判斷基本類型,以及TS獨有的類型 -
name in p
:判斷某個key是不是在對象里,只適用于部分普通對象 -
is
:類型謂詞,可以作為通用方法,必須是普通函數
,不能是箭頭函數
,缺點是比較麻煩
type Rect = {
width: number
height: number
}
type Circle = {
center: [number,number]
radius: number
}
// 如果是 boolean 的話,下面a類型還是 Rect | Circle
function isRect(x:Rect | Circle):boolean{
return 'width' in x && 'heght' in x
}
// 如果是 is 的話,下面a類型就可以推斷出是Rect類型
function isRect(x:Rect | Circle): x is Rect{
return 'width' in x && 'heght' in x
}
const fn = (a:Rect | Circle)=>{
if(isRect(a)){
console.log(a);
}
}
- 可辨別聯合類型:給各個類型加個
kind
來區分,kind必須是簡單類型,不能是復雜類型。這種方法的目的是讓復雜類型的對比變成簡單類型的對比
type Rect = {
kind: 'Rect'
width: number
height: number
}
type Circle = {
kind: 'Circle'
center: [number,number]
radius: number
}
type Shape = Rect | Circle
const fn = (x: Shape ) => {
if(x.kind === 'Rect'){
x // Rect
}else if (x.kind === 'Circle'){
x // Circle
}
}
- 斷言
as
,強制收縮
-
unknown
類型可以被類型收窄成任何類型,相當于是所有類型的聯合類型