在 TypeScript 中,使用布尔值来区分联合类型是一种常见的模式,通常称为“标签联合”或“判别联合”。这种模式通过在每个联合成员中添加一个共同的布尔属性来区分不同的类型。
假设我们有一个联合类型 Shape
,它可以是 Circle
或 Square
。我们可以使用一个布尔属性 isCircle
来区分这两种类型。
interface Circle {
isCircle: true;
radius: number;
}
interface Square {
isCircle: false;
sideLength: number;
}
type Shape = Circle | Square;
在这个例子中,Circle
和 Square
都有一个共同的布尔属性 isCircle
,但它们的值不同:Circle
的 isCircle
为 true
,而 Square
的 isCircle
为 false
。
我们可以使用类型保护来区分联合类型的不同成员:
function getArea(shape: Shape): number {
if (shape.isCircle) {
// TypeScript 知道 shape 是 Circle
return Math.PI * shape.radius * shape.radius;
} else {
// TypeScript 知道 shape 是 Square
return shape.sideLength * shape.sideLength;
}
}
// 示例用法
const myCircle: Circle = { isCircle: true, radius: 5 };
const mySquare: Square = { isCircle: false, sideLength: 10 };
console.log(getArea(myCircle)); // 输出: 78.53981633974483
console.log(getArea(mySquare)); // 输出: 100
Circle
和 Square
接口都有一个共同的布尔属性 isCircle
。Shape
类型是 Circle
和 Square
的联合类型。getArea
函数中,我们使用 if (shape.isCircle)
来检查 isCircle
属性。isCircle
的值自动推断 shape
的具体类型。isCircle
为 true
,TypeScript 知道 shape
是 Circle
类型。isCircle
为 false
,TypeScript 知道 shape
是 Square
类型。你也可以使用其他布尔属性来区分联合类型。例如,假设我们有一个联合类型 Vehicle
,它可以是 Car
或 Bike
,我们可以使用布尔属性 isCar
来区分这两种类型:
interface Car {
isCar: true;
numberOfDoors: number;
}
interface Bike {
isCar: false;
hasPedals: boolean;
}
type Vehicle = Car | Bike;
function describeVehicle(vehicle: Vehicle): string {
if (vehicle.isCar) {
return `This car has ${vehicle.numberOfDoors} doors.`;
} else {
return `This bike ${vehicle.hasPedals ? 'has' : 'does not have'} pedals.`;
}
}
// 示例用法
const myCar: Car = { isCar: true, numberOfDoors: 4 };
const myBike: Bike = { isCar: false, hasPedals: true };
console.log(describeVehicle(myCar)); // 输出: This car has 4 doors.
console.log(describeVehicle(myBike)); // 输出: This bike has pedals.
通过这种方式,你可以在 TypeScript 中使用布尔值来区分联合类型,并利用类型保护来处理不同的类型。
领取专属 10元无门槛券
手把手带您无忧上云