我正在尝试创建一个小的函数,该函数将采用类型为apple的数组|橙色|梨|芒果,并将其转换为一个自定义的字典字典接口,它只是一个对象。
我的代码:
private mapArrayToDictionary = (
array:
| Apple[]
| Orange[]
| Pear[]
| Mango[]
) => {
const sorted: Dictionary<typeof array> = {};
array.map((fruit) => (sorted[fruit.id] = fruit));
return sorted;
};
我正在尝试动态地将返回数组分配为与作为参数传入的数组相同的类型。然后,我将以该id为键,并以值作为水果对象本身。
我收到错误消息:“ Apple类型无法分配为'Orange [] | Pear [] | Mango []等。
我假设我只能制作一个通用的水果接口类型,但是我不明白为什么这种“数组类型”不能继承。谢谢
编辑: 我的功能可用于所有相同属性的水果
function mapArrayToDictionary(
array:
| Apple[]
| Orange[]
| Mango[]
) {
type AnyFruitArray =
| Apple
| Orange
| Mango;
const sorted: Dictionary<AnyFruitArray> = {};
array.map(item => (sorted[item.id] = item));
return sorted;
}
我的水果界面:
export interface Fruit {
name: string;
type: string;
}
export interface Apple extends Fruit{
id: number;
}
export interface Pear extends Fruit {
id: number;
location_id: number;
location_name: string;
producer: string;
}
我如何调用函数:
const apples = await CalAPI.fetchApplesByIds(fruitIds);
this.setState({ relApples: mapArrayToDictionary(apples)});
答案 0 :(得分:2)
Generics进行救援:
private mapArrayToDictionary = <T extends { id: string | number }>(
array: T[]
) => {
const sorted: Dictionary<T> = {};
array.map((fruit) => (sorted[fruit.id] = fruit));
return sorted;
};
请注意,Fruit
没有属性id
,因此即使您想限制此方法只接受可以接受的类型,也无法简单地使用<T extends Fruit>
。还实现了Fruit
的字段,我建议使用intersection type <T extends Fruit & { id : string | number }>
。
或者,如果您只需要处理几种已知的水果类型(并假设所有这些类型均包含有效的id
属性),则可以对这些已知的水果类型进行并集:
type KnownFruit = Apple | Orange | Pear | Mango;
...
private mapArrayToDictionary = <T extends KnownFruit>(
array: T[]
) => {
const sorted: Dictionary<T> = {};
array.map((fruit) => (sorted[fruit.id] = fruit));
return sorted;
};