代码之家  ›  专栏  ›  技术社区  ›  sunknudsen

在下面的示例中,为什么不“fleet:vehicle3”抛出错误?

  •  0
  • sunknudsen  · 技术社区  · 5 年前

    想弄清楚 generics .

    我的理解是 const friday:Transport<Car> 集合 T Car .

    鉴于 vehicle3 属于类型 Bike ,为什么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 ,因此下面的行为与我预期的一样,因为 小型车 自行车 具有冲突的属性。

    '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'
    }
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   Alexey Romanov    5 年前

    这可以简化为

    const v4: Car = vehicle3
    

    typescript接口是结构化的,因此 Vehicle , Car Bike 都一样。见 Type Compatibility .