一、什么是联合类型?
联合类型使用竖线 |
作为分隔符,表示一个值可以是列出的类型中的任意一种。
typescript
// ID 只接收数字或字符串作为参数
function printId(id: number | string) {
console.log("Your ID is: " + id);
}
printId(101); // OK
printId("202"); // OK
printId({ id: 303 }); // 类型"{ id: number; }"的参数不能赋给类型"string | number"的参数。
二、使用类型守卫收窄类型(断言类型)
1. typeof
类型守卫
typeof
是最常见的类型守卫,一般处理 string
, number
, boolean
, symbol
, bigint
, undefined
, function
这些基础类型时使用。
typescript
function printId(id: number | string) {
if (typeof id === 'string') {
// 在这个代码块内,TypeScript 知道 id 的类型是 string
console.log(id.toUpperCase());
} else {
// 在这个代码块内,TypeScript 知 id 的类型是 number
console.log(id);
}
}
printId('good');
printId(10);
2. instanceof
类型守卫
当处理类的实例时,使用instanceof
判断类型
typescript
class User {
constructor(public name: string) {
this.name = name;
}
}
class Product {
constructor(public title: string) {
this.title = title;
}
}
function printEntity(entity: User | Product) {
if (entity instanceof User) {
// entity 被收窄为 User 类型
console.log("User: " + entity.name);
} else {
// entity 被收窄为 Product 类型
console.log("Product: " + entity.title);
}
}
let user = new User('john')
printEntity(user)
let product = new Product('title')
printEntity(product)
3. in
操作符守卫
在判断对象的属性时,常常使用in
。
typescript
interface Fish {
swim: () => void;
}
interface Bird {
fly: () => void;
}
function move(animal: Fish | Bird) {
if ("swim" in animal) {
// animal 被收窄为 Fish 类型
return animal.swim();
}
// animal 被收窄为 Bird 类型
return animal.fly();
}
let fish = {
swim:()=>{
console.log('fish is swim');
}
}
let bird = {
fly:()=>{
console.log('bird fly');
}
}
move(fish);
move(bird);
总结
如果你喜欢本教程,记得点赞+收藏!关注我获取更多TypeScript开发干货