如果一个类型是多个类型的联合类型,且多个类型含有一个公共属性,那么就可以利用这个公共属性,来创建不同的类型保护区块。
enum CarTransmission {
Automatic = 200,
Manual = 300
}
interface Motorcycle {
vType: "motorcycle"; // discriminant
make: number; // year
}
interface Car {
vType: "car"; // discriminant
transmission: CarTransmission
}
interface Truck {
vType: "truck"; // discriminant
capacity: number; // in tons
}
基于前面定义了三个接口,我们可以创建一个 Vehicle
联合类型:
type Vehicle = Motorcycle | Car | Truck;
接下来进行类型守卫
function evaluatePrice(vehicle: Vehicle) {
switch(vehicle.vType) {
case "car":
return vehicle.transmission * EVALUATION_FACTOR;
case "truck":
return vehicle.capacity * EVALUATION_FACTOR;
case "motorcycle":
return vehicle.make * EVALUATION_FACTOR;
}
}
完整demo
interface car{
type:'car',
age:number
}
interface bicycle{
type:'bicycle',
sex: number
}
interface boat{
type:'boat',
grade:number
}
type Vehicle = car | bicycle | boat;
const EVALUATION_FACTOR = Math.PI;
function evaluatePrice(vehicle: Vehicle) {
switch(vehicle.type) {
case "car":
return vehicle.age * EVALUATION_FACTOR;
case "bicycle":
return vehicle.sex * EVALUATION_FACTOR;
case "boat":
return vehicle.grade * EVALUATION_FACTOR;
}
}
const myTruck: car = { type: "car", age: 9.5 };
const VehicleDate = evaluatePrice(myTruck);
console.log(VehicleDate);