NgForOf<string | string[], NgIterable<string | string[]>>

NgForOf<string | string[], NgIterable<string | string[]>>

我有一个数据类型:

export interface TYPE_A {
  valueType: TYPE_A_VALUE_TYPES;
  value: string | string[];
}

export enum TYPE_A_VALUE_TYPES {
  singleValue = "singleValue",
  multiValue = "multiValue",
}

而且,我在 @Input 的组件中使用 TYPE_A:

@Input() datas: TYPE_A[] = [];

这是我的 HTML 代码:

<div class="feildContainer" *ngFor="let data of datas">
    <div class="singleFeild" *ngIf="data.valueType == 'singleValue'">
         ...
    </div>
    <div class="multiFeild" *ngIf="data.valueType == 'multiValue'">
        <other-component *ngFor="let dataValue of data.value"></other-component>
    <div>
</div>

我在 vscode 中收到此错误:

NgForOf<string | string[], NgIterable<string | string[]>>.ngForOf: NgIterable<string | string[]> | null | undefined

我理解这个错误的逻辑,但我正在寻找解决这个问题的最佳方法。

  <other-component *ngFor="let dataValue of $any(data.value)"></other-component>

这会删除变量的类型。当您无法正确推断变量类型时,可以在 HTML 中使用它。

使用有区别的联合作为你的类型:

export interface TYPE_A_SINGLEVALUE {
  valueType: TYPE_A_VALUE_TYPES.singleValue;
  value: string;
}
export interface TYPE_A_MULTIVALUE {
  valueType: TYPE_A_VALUE_TYPES.multiValue;
  value: string[];
}

export enum TYPE_A_VALUE_TYPES {
  singleValue = "singleValue",
  multiValue = "multiValue",
}

然后,当你想使用 value 项目时,你首先检查 valueType 与两个可能值之一,编译器会知道你想引用单值或多值项目并相应地假设。在 valueTypeif 之后 value 将不会是 string | string[],而是 stringstring[] 已检查。