【发布时间】:2019-01-20 13:03:23
【问题描述】:
我有几个接口和一个联合类型:
export interface FieldOptions {
value: string | number;
viewValue: string;
}
export interface BaseField {
id: string;
derived?: boolean;
required?: boolean;
}
export interface NumberField extends BaseField {
type: 'number';
decimals: number;
}
export interface SelectField extends BaseField {
type: 'select' | 'select-multi';
options: FieldOptions[];
source?: string;
}
export type Field = NumberField | SelectField;
据我了解,当我使用联合类型字段时,它的主要字段可以是数字或选择。
有了这些知识,我的 Angular 组件中有一个函数
getField( key: string ): Field {
return this.fields.filter( el => el.id === key )[ 0 ];
}
getFieldVersion2( key: string ): any {
const field = this.fields.filter( el => el.id === key )[ 0 ];
if ( (<SelectField>field).options ) {
return field as SelectField;
} else {
return field as Field;
}
}
仅使用在我的模板中调用的函数getField 来获取字段对象,在本例中为带有视图/视图值的选项数组的选择,我在 TS 上收到构建错误:
Property 'options' does not exist on type 'Field'.
Property 'options' does not exist on type 'NumberField'.
据我了解,Field 是 Number 或 Select 的联合类型。其中一个有options 属性,另一个没有。
所以我创建了getFieldVersion2,希望能解决这个问题。但是,除非我将 any 添加为我的函数的结果类型,否则它将触发构建错误。
使用options的模板触发编译错误:
<mat-form-field class="input">
<mat-select formControlName="state">
<mat-option *ngFor="let option of getField( 'state' ).options" [value]="option.value">
{{option.viewValue}}
</mat-option>
</mat-select>
</mat-form-field>
发生了什么,我应该做些什么更好?
【问题讨论】:
-
似乎您遇到的错误是尝试实际使用
getField并可能读取可能存在或不存在的options属性的代码;您也可以发布该代码吗?getFieldVersion2在运行时与getField并没有什么不同,因为您在示例中声明的所有 TypeScript 类型在编译为 JavaScript 时都会消失。 -
完全正确。但是在 typescript 的编译期间,编译器对
getFieldVerstion2很满意。我将修改我的问题并添加模板代码
标签: angular typescript union-types