javascript 推断TypeScript数组而不丢失索引

piah890a  于 2023-06-04  发布在  Java
关注(0)|答案(2)|浏览(175)

我正在写一个函数的类型。
我使用这个简单的代码示例使其更容易理解:

const getValues: <T extends Array<() => any>>(
  ...args: T
) => T extends Array<() => infer R> ? R[] : null = (...args) =>
  args.map((arg) => arg());

const values = getValues(
  () => "a",
  () => 123
);

我希望values的类型为[string, number],但它的类型为(string|number)[]

rur96b6h

rur96b6h1#

找到了!

const getValues: <T extends readonly unknown[] | []>(
  ...args: T
) => { -readonly [P in keyof T]: ReturnType<T[P]> } = (...args) =>
  args.map((arg) => arg());

const values = getValues(
  () => "a",
  () => 123
);
9jyewag0

9jyewag02#

要确保values数组被推断为[string, number]而不是(string|number)[],可以更新getValues函数的类型。下面是代码的调整版本:

const getValues: <T extends Array<() => any>>(
  ...args: T
) => T extends Array<() => infer R> ? { [K in keyof T]: R } : null = (...args) =>
  args.map((arg) => arg()) as any;

const values = getValues(
  () => "a",
  () => 123
);

通过使用Map类型{ [K in keyof T]: R },我们确保结果类型getValues是一个与输入数组长度相同的数组,其中每个元素都具有推断类型R。在这种情况下,R将被推断为第一个函数的string和第二个函数的number,从而导致values变量的所需类型[string, number]

相关问题