gpt4 book ai didi

javascript - TypeScript 中具有不同对象的数组

转载 作者:搜寻专家 更新时间:2023-10-30 20:54:28 24 4
gpt4 key购买 nike

在从同一类继承的一个数组中收集各种不同的对象时,如何在 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
}
]

这样做,我会遇到错误。

如果我不想显示任何错误,我只能添加高级接口(interface) 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
]

或者像这样将数组的类型更改为车辆、汽车或自行车的数组:

let vehicles: Array<IVehicle | ICar | IBike> =
[
{
modelName: "carModelName",
numberOfDoors: 4,
isDropTop: true,
},
{
modelName: "bikeModelName",
hasDynamo: true
}
]

如果稍后您想确定 IVehicleIBike 还是 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);
}
}

您可以在 Advanced types 中阅读更多关于它们的信息手册的一部分。

您还可以在 playground 中找到整个代码的工作示例 here .

关于javascript - TypeScript 中具有不同对象的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44720457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com