【问题标题】:Why typescript allows cast anonymous type to object even if the type does not match the object props为什么打字稿允许将匿名类型转换为对象,即使类型与对象道具不匹配
【发布时间】:2019-12-21 21:18:38
【问题描述】:

在我的打字稿代码中,我只需要用新值更新我的类的一个属性。

export class ValidationState {
  isLabourComponentValid: boolean = true;
  isTableValid: boolean = true;
  isFaultCausingPartValid: boolean = true;


  public mergeValues(newValue: ValidationState){
    Object.assign(this, newValue);
    return this;
  }
}

用法是:我只向合并函数发送一个属性,我强制转换属性,以匹配所需的类型,即使不是那种类型,但打字稿让我去做。

  ValidationState.mergeValues({isLabourComponentValid: false} as ValidationState);
  ValidationState.mergeValues({isTableValid: false} as ValidationState);

结果是,Validation 类已正确更新,新的类值为:{false, false, true}。 一切正常,我可以使用新属性扩展类,并通过合并功能对其进行更新,我不需要关心进一步的合并。然而,这是一个好方法吗? 其他方法是逐个属性手动更新属性,这也是类型安全的。

【问题讨论】:

  • 我允许它,因为 casting 是为了在某种程度上绕过类型系统。这是由程序员完成的,以告诉编译器将给定的值视为不同的类型,而不管编译器的想法如何。它本质上是不安全的,是的,但它绕过了程序员确实知道Array<Animal>实际上只有Cat对象的情况。

标签: angular typescript casting


【解决方案1】:

这很好用,但更简洁的方法是接受Partial<ValidationState> 作为mergeValues() 的参数。你不再需要type assertion(这只是告诉编译器的一种方式:相信我,我知道我在做什么)。

【讨论】:

    【解决方案2】:

    您可以将mergeValues 函数的参数设置为Partial<ValidationState>,而不是强制转换。

    当您进行投射时,您是在告诉 TypeScript 盲目相信您发送的内容是正确的。使用Partial 会给你更多的类型安全,因为TypeScript 至少会检查传入的内容是ValidationState 的子集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-03
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      • 1970-01-01
      • 1970-01-01
      • 2020-12-15
      相关资源
      最近更新 更多