为什么给定函数的泛型类型不能在typescript中推断?

1mrurvl1  于 2023-03-13  发布在  TypeScript
关注(0)|答案(1)|浏览(127)

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推断类型正确。

xwbd5t1u

xwbd5t1u1#

无法推断类型参数Itemgeneric类型参数,因为调用签名中对Item的唯一引用是作为T类型参数的约束,而约束在TypeScript中未用作推断站点。有关最终被拒绝的从约束推断类型参数的请求,请参见microsoft/TypeScript#7234
这意味着当你调用flatAndMerge()时,T的类型参数可以很容易地从作为data传递的参数中推断出来,但是没有地方可以从中推断出Item,所以它福尔斯到它的约束,隐式地是unknown类型。

相关问题