【问题标题】:How do I get the type from an object variable in Typescript / Angular 7?如何从 Typescript / Angular 7 中的对象变量中获取类型?
【发布时间】:2019-12-01 23:32:28
【问题描述】:

我正在尝试从自定义对象实例中获取类型/类。然后,这将用作传递给泛型函数的类型参数,而不仅仅是使用“任何”类型。

我已经尝试过 foo.prototype、Object.getPrototypeOf(foo)、typeof foo、foo.constructor、foo.constructor.name 等,但还没有找到返回对象类型/类本身的方法。下面的示例说明了我想要实现的目标 - 它在这里不起作用,因为 constructor.name 只返回类型的名称:

var vehicle 

if (selected == 'car') { 
vehicle = new Car() 
} else { 
vehicle = new Bike()  
} 

var vehicleType = vehicle.constructor.name

buildVehicle<vehicleType>(vehicle) 

buildVehicle<T>(vehicle:T) { 
    do stuff… 
}

我对 typescript 和 javascript 还很陌生,所以我不确定这是否可行,但希望有办法做到这一点。

感谢您对此的任何帮助。

【问题讨论】:

  • Typescript 类型在运行时不存在,因此您无法从对象实例中获取vehicleType,然后将其作为类型参数传递给buildVehicle&lt;vehicleType&gt;(vehicle)。如果您考虑一下,buildVehicle&lt;vehicleType&gt;(vehicle) 需要 compile-time 的类型,但如果您的代码确实有效,您只能在 run-time获得该类型>.
  • @MichałTkaczyk - 该链接只获取名称 - 我想获取类型本身
  • @Collierre - 如果我想获得一个接口,我认为这只是一个限制(即你可以在运行时获得类但不能获得接口)。我知道如果我明确输入 buildVehicle&lt;Car&gt;(vehicle) 它将正常工作 - 我只是不知道如何从实例中获取对 Car(或 Bike)的引用。
  • @TeMo,typescript 在运行时是 javascript,而在运行时的 javascript 中,您无法从其中一个实例中获取类(尽管您可以获取类名)。因此你也不能在打字稿中。

标签: angular typescript


【解决方案1】:

尝试使用联合类型:type Vehicle = Bike | Car;

【讨论】:

  • 添加更多相关数据,让您的 A 更好
  • 这很有效,而且似乎比使用any 更好。如果我找不到从实例中获取确切类型的方法,我很可能会将此作为下一个最佳选择。看看这里是否有其他想法:)
  • 另一种选择是buildVehicle(vehicle: Car|Bike) {
【解决方案2】:

在您的示例中,您根本不应该将类型添加到泛型中。 TypeScript 可以在此上下文中推断类型,因为 T 使用了参数。

// Use it like this: 
buildVehicle(vehicle);

如果你真的想在这里添加泛型,你可以使用typeof

buildVehicle<typeof vehicle>(vehicle);

在这种情况下,这相当于

buildVehicle<Car | Bike>(vehicle);

因为在编译时无法确定vehicle 实际具有的类型。它只能在运行时确定。但由于 TypeScript 类型在转译过程中丢失(因为它转译为 JavaScript),所以您当前的代码无法做到这一点。

但是,您可以更改代码以使其在编译时可确定。

if (vehicle instanceof Car) {
   buildVehicle<Car>(vehicle); // Vehicle is narrowed down to type "Car"
} else if (vehicle instanceof Bike) { // else would suffice if only 2 possible types
   buildVehicle<Bike>(vehicle); // Vehicle is narrowed down to type "Bike"
}

不过,就你而言,这可能没有多大意义。

【讨论】:

  • 不确定 - 类型可能被正确推断,但我认为我应该能够传入类型参数以使其明确。
  • 如果要添加类型,它需要是联合类型,如其他答案所述。由于类型可以在运行时动态更改,因此变量的类型为Bike | Car。由于通用信息在运行时会丢失,因此您无能为力。
  • 感谢您的澄清。接受这个作为答案,因为它似乎涵盖了所有选项,包括使用 instanceof 在编译时获取确切类型。我现在将使用更紧凑的联合类型 Bike|Car 方法,如果我需要额外的精度,则切换到对 instanceOf 的更详细的条件检查。感谢所有为此提供帮助的贡献者(我已独立投票支持所有答案)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 2016-06-03
  • 2020-04-13
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
相关资源
最近更新 更多