Javascript TypeScript中具有不同对象的数组

Javascript TypeScript中具有不同对象的数组,javascript,typescript,Javascript,Typescript,当在一个数组中收集从同一个类继承的不同对象时,如何在TypeScript中设置上级类,以便TypeScript不会显示错误 我试着这样做: interface IVehicle{ modelName: string } interface ICar extends IVehicle{ numberOfDoors: number, isDropTop: boolean } interface IBike extends IVehicle{ hasDynamo:

当在一个数组中收集从同一个类继承的不同对象时,如何在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
        }
    ]
这样做,我会出错


如果我不想显示任何错误,我只需要添加高级接口的对象。

修复语法错误后,您可以指定数组中每个条目的类型

接口车辆{
modelName:string
}
接口ICar扩展IVehicle{
numberOfDoors:number,
isDropTop:布尔型
}
接口IBike扩展了IVehicle{
hasDynamo:布尔型
}
出租车辆:IVehicle[]=
[
{
型号名称:“carModelName”,
门数:4,
是的,
}作为ICar,
{
型号名称:“bikeModelName”,
哈斯迪纳摩:是的
}作为伊比克
]
或者将数组的类型更改为车辆、汽车或自行车的数组,如下所示:

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
        }
    ]
let车辆:阵列=
[
{
型号名称:“carModelName”,
门数:4,
是的,
},
{
型号名称:“bikeModelName”,
哈斯迪纳摩:是的
}
]
如果以后要确定iVihicleIBike还是ICar,则可以使用用户定义的类型保护来执行此操作

功能为自行车(车辆:IVehicle):车辆为IBike{
返回(车辆)。hasDynamo!==未定义;
}
功能isCar(车辆:IVehicle):车辆为ICar{
返回(车辆)。车门数!==未定义;
}
功能日志(车辆:IVehicle){
if(智能自行车(车辆)){
//tsc知道这辆车是IBike
控制台.log(车辆.hasdynamino);
}否则,如果(isCar(车辆)){
//tsc知道车辆是ICar
控制台.日志(车辆.车门数量);
}否则{
控制台.log(车辆.modelName);
}
}
您可以在手册的章节中阅读更多关于它们的信息


您还可以在操场上找到完整代码的工作示例。

谢谢。我也可以向ICar或IBike投币吗?例如,当我从该数组中获取对象时,typescript中没有强制转换,只有类型断言。如果您需要找出条目的特定类型,可以使用typeguards,我将为此添加一个示例。