交叉類型與聯合類型 第三節
- 2020 年 11 月 24 日
- 筆記
- typescript
交叉類型
將多個類型合併為一個類型, 新類型具有所有類型的特性
名稱上看 交叉類型是取兩個類型的交集,但這裡其實是取類型的並集
interface DogInterface{
name: string,
run(): void
}
interface CatInterface{
age: number,
jump(): void
}
// 交叉類型必須滿足所有類型
let pet: DogInterface & CatInterface = {
name: '',
age: 1,
jump: ()=>{},
run: ()=>{},
}
聯合類型
當聲明的類型並不確定,可能是多個類型中的一個
名稱上看 聯合類型是兩個類型的並集, 但這裡是取類型的交集
// 字面量聯合類型
// 有時候我們不僅要限制一個變數的類型 而且要限定到 某個具體的範圍內
let a: number | string = ''
let b: 'a' | 'b' | 'c' = 'c'
let c: 1 | 2 | 3 = 2
// 繼續以上面的介面類型為例
// 聯合類型必須完全滿足其中一個類型如: name run() | age jump()
let pet: DogInterface | CatInterface = {
name: '',
run: ()=>{},
}
// 我們繼續看下面的例子
interface DogInterface{
run(): void
eat(): void
}
interface CatInterface{
jump(): void
eat(): void
}
class Dog implements DogInterface{
run(){}
eat(){}
}
class Cat implements CatInterface{
jump(){}
eat(){}
}
enum Master { Boy, Girl }
function getPet(master: Master){
let pet = master === Master.Boy ? new Dog() : new Cat();
// 使用聯合類型時 在類型不確定的情況下那麼它只能取 類型的共有成員 eat
pet.eat()
// 類型保護
if(pet instanceof Dog){
pet.run()
}else{
pet.jump()
}
return pet;
}
// 聯合類型 通常利用共有的屬性來創建 類型保護區塊
interface Dog {
name: 'xiaogou',
age: number
}
interface Cat{
name: 'xiaomao',
color: string
}
interface Pig{
name: 'xiaozhu',
hobby: string
}
type Animal = Dog | Cat | Pig;
/* 當我們函數中並為校驗 pig時返回 undefined 但沒有報錯
通過兩種方式進行解決:
1、定義返回值類型 如:function animal():string{} 當返回值為undefined時提示錯誤
2、定義never類型 當default 是never類型時,說明之前定義無效,需要檢查錯誤
*/
function animal(params: Animal) {
switch (params.name) {
case 'xiaogou':
return '我兩歲了'
break;
case 'xiaomao':
return '我是黃色的'
break;
default:
return ((e: never) => { throw new Error(e) })(params);
}
}
console.log(animal({ name: 'xiaozhu', hobby: '吃'}))