在从同一个类继承的一个数组中收集各种不同的对象时,如何在TypeScript中设置一个优等的类,以便TypeScript不显示错误?
我正在尝试这样:
interface IVehicle{
modelName: string
}
interface ICar extends IVehicle{
numberOfDoors: number,
isDropTop: boolean
}
interface IBike extends IVehicle{
hasDynamo: boolean
}
var vehicles: IVehicle[] =
[
{
modelName: "carModelName", // Error
numberOfDoors: 4,
isDropTop: true
},
{
modelName: "bikeModelName",
hasDynamo: true
}
]
Run Code Online (Sandbox Code Playgroud)
这样做,我遇到了错误.
IVehicle如果我不想显示任何错误,我只能添加上级界面的对象.
修复语法错误后,您可以指定数组中每个条目的类型.
interface IVehicle {
modelName: string
}
interface ICar extends IVehicle {
numberOfDoors: number,
isDropTop: boolean
}
interface IBike extends IVehicle {
hasDynamo: boolean
}
let vehicles: IVehicle[] =
[
{
modelName: "carModelName",
numberOfDoors: 4,
isDropTop: true,
} as ICar,
{
modelName: "bikeModelName",
hasDynamo: true
} as IBike
]
Run Code Online (Sandbox Code Playgroud)
或者只是将数组的类型更改为车辆,汽车或自行车的数组,如下所示:
let vehicles: Array<IVehicle | ICar | IBike> =
[
{
modelName: "carModelName",
numberOfDoors: 4,
isDropTop: true,
},
{
modelName: "bikeModelName",
hasDynamo: true
}
]
Run Code Online (Sandbox Code Playgroud)
如果以后你要确定一个IVehicle是IBike或ICAR您可以使用用户定义类型警卫去做.
function isBike(vehicle: IVehicle): vehicle is IBike {
return (<IBike>vehicle).hasDynamo !== undefined;
}
function isCar(vehicle: IVehicle): vehicle is ICar {
return (<ICar>vehicle).numberOfDoors !== undefined;
}
function log(vehicle: IVehicle) {
if (isBike(vehicle)) {
// tsc knows vehicle is IBike
console.log(vehicle.hasDynamo);
} else if (isCar(vehicle)) {
// tsc knows vehicle is ICar
console.log(vehicle.numberOfDoors);
} else {
console.log(vehicle.modelName);
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在本手册的" 高级类型"部分中阅读有关它们的更多信息.
您还可以在这里找到操场上整个代码的工作示例.
| 归档时间: |
|
| 查看次数: |
323 次 |
| 最近记录: |