flatAndMerge
中的泛型类型Item
为什么不能推导出来?未知。
type ItemRecord<Item> = Record<string, Item>
export const objectToFlatList = <Item>(data: ItemRecord<Item>) =>
Object.keys(data).map((key) => ({ key, ...data[key] }));
export const flatAndMerge = <
Item,
T extends Record<string, ItemRecord<Item>>,
>(
data: T,
fields: (keyof T)[],
) => fields.flatMap((field) => objectToFlatList(data[field]));
const a = flatAndMerge(
{
a: {
aa: { foo: 'foo' } ,
ab: { foo: 'foo' },
},
b: {
ba: { foo: 'foo' },
bb: { foo: 'foo' },
},
c: {
ca: { foo: 'foo' },
cb: { foo: 'foo' },
},
} as Record<string, ItemRecord<{ foo: string }>>, //
['a', 'c'],
);
作为备注:objectToFlatList
推断类型正确。
1条答案
按热度按时间xwbd5t1u1#
无法推断类型参数
Item
的generic类型参数,因为调用签名中对Item
的唯一引用是作为T
类型参数的约束,而约束在TypeScript中未用作推断站点。有关最终被拒绝的从约束推断类型参数的请求,请参见microsoft/TypeScript#7234。这意味着当你调用
flatAndMerge()
时,T
的类型参数可以很容易地从作为data
传递的参数中推断出来,但是没有地方可以从中推断出Item
,所以它福尔斯到它的约束,隐式地是unknown
类型。