Angular TypeScript / 类型缩小(小问题)

问题描述 投票:0回答:1

我正在尝试实现这个:

// type A guard alternative
  private isTypeA_alt(object: AnyDTO): object is A_DTO {
    return (
      object.type === this.Types.Type_A && object.uniquePropertyA !== undefined
    );
  }

  // type A,B,C, etc. guard handler...
  private castObjectToType(object: unknown): AnyDTO | undefined {
    if (object === undefined || !this.hasProperty(object, 'type')) {
      return undefined;
    }

    switch (object.type) {
      case this.Types.Type_A:
        return object as A_DTO;
      case this.Types.Type_B:
        return object as B_DTO;
      default:
        return undefined;
    }
  }

但我不确定为什么铸造不起作用......(参见下面的 stackblitz)

堆栈闪电战: https://stackblitz.com/edit/stackblitz-starters-6eped6?file=src%2Fcmp%2Fcmp.component.ts

我是否必须为每个可用类型创建一个类型保护函数?

angular typescript casting
1个回答
0
投票

我简化了您的代码并使其可以使用

<T>
工作,每当我们调用该方法时我们都可以定义类型,它将定义该变量的类型!

类型功能

private castObjectToType<T>(object: AnyDTO): T | undefined {
    if (object === undefined || !this.hasProperty(object, 'type') || !object.type) {
      return undefined;
    }
    return object as T;
}

键入函数调用

// type function handler - CANNOT GET TO WORK : (
let variable = this.castObjectToType<B_DTO>(this.object);
variable?.uniquePropertyB; //--> adding question mark, since it can be undefined, so we do a safe check!
© www.soinside.com 2019 - 2024. All rights reserved.