typescript 绑定类型的联合(A| B)在Angular 中的类型(A)的属性

fwzugrvs  于 2022-12-14  发布在  TypeScript
关注(0)|答案(1)|浏览(160)

我有一个包含Node<Item | Category>的树结构

type Item {
    type: string; // DB discriminator that defaults to 'I'
    id: string;
    name: string;
    text: string[];
}
type Category {
    type: string; // DB discriminator that defaults to 'C'
    id: string;
    name: string;
    sub: Category[];
}
interface Node<Item | Category> {
    data: Item | Category;
}

然后有两个分量CategoryAndItemTreeComponentItemDetailsComponent

@Component({ selector: 'app-tree', ... })
export class CategoryAndItemTreeComponent ... {
    selected?: Node<Item | Category> = null;
    ...
}

@Component({ selector: 'app-item', ... })
export class ItemDetailsComponent ... {
    item?: Item;
    ...
}

我想将详细信息字段绑定到HTML中的选定字段:

<app-tree #treeLink></app-tree>
<app-item [item]="treeLink.selected?.data"></app-item>

...但是item字段的类型是Item,而treeLink.selected?.dataItem | Category的并集。
如何检查示例、强制转换和赋值?
这在Angular或TypeScript中是不允许的吗?显然,这可以编译(在.ts文件中),但在模板中不允许。

this.item = <Item>selected;
b1zrtrql

b1zrtrql1#

为了在模板中添加类型转换,请使用为您创建类型转换的自定义管道

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'customCast',
  pure: true,
})
export class AsPipe implements PipeTransform {

 transform<T, S extends T>(value: S): T {
     return <T>value;
 }

}

然后可以在模板中使用它

treeLink.selected?.data | customCast Item

相关问题