【问题标题】:In the following example, why doesn’t `fleet: vehicle3` throw an error?在下面的例子中,为什么 `fleet: vehicle3` 不抛出错误?
【发布时间】:2019-09-20 04:25:53
【问题描述】:

试图弄清楚generics

我的理解是const friday:Transport<Car>T 设置为Car

鉴于 vehicle3Bike 类型,为什么 TypeScript 不抛出错误?

'use strict';

interface Vehicle {
  brand: string;
}

interface Bike extends Vehicle {}

interface Car extends Vehicle {}

interface Transport<T> {
  fleet: T;
  manager: string;
}

const vehicle1: Car = {
  brand: 'Honda',
}

const vehicle2: Car = {
  brand: 'Toyota'
}

const vehicle3: Bike = {
  brand: 'Specialized'
}

const today:Transport<Car> = {
  fleet: vehicle1,
  manager: 'Cindy'
};
const tomorrow:Transport<Car[]> = {
  fleet: [vehicle1, vehicle2],
  manager: 'John'
}
const friday:Transport<Car> = {
  fleet: vehicle3,
  manager: 'Steve'
}

编辑

正如 Alexey 所指出的(谢谢!),TypeScript 接口是 structural,因此以下行为符合我的预期,因为 CarBike 具有冲突的属性。

'use strict';

interface Vehicle {
  brand: string;
}

interface Bike extends Vehicle {
  rider: string
}

interface Car extends Vehicle {
  driver: string
}

interface Transport<T> {
  fleet: T;
  manager: string;
}

const vehicle1: Car = {
  brand: 'Honda',
  driver: 'Alex'
}

const vehicle2: Car = {
  brand: 'Toyota',
  driver: 'Bob'
}

const vehicle3: Bike = {
  brand: 'Specialized',
  rider: 'George'
}

const today:Transport<Car> = {
  fleet: vehicle1,
  manager: 'Cindy'
};
const tomorrow:Transport<Car[]> = {
  fleet: [vehicle1, vehicle2],
  manager: 'John'
}
const friday:Transport<Car> = {
  fleet: vehicle3,
  manager: 'Steve'
}

【问题讨论】:

    标签: typescript


    【解决方案1】:

    这可以简化为

    const v4: Car = vehicle3
    

    TypeScript 接口是结构化的,所以VehicleCarBike 都是相同的。见Type Compatibility

    【讨论】:

    猜你喜欢
    • 2014-06-19
    • 2021-09-10
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 2014-01-15
    • 2017-10-13
    相关资源
    最近更新 更多