在 TypeScript 中提取元组最后一个元素的类型

qjn*_*jnr 1 typescript typescript-generics

本质上,我试图编写的是一个函数,它接受不同类型的数组(用它做一些事情),然后仅基于该数组中的最后一个元素返回一个类型(先前的元素已被处理,但仅处理了最后一个元素用于返回值)。

我知道我可以编写一个函数,该函数返回基于所有元素类型的数组,如下所示。

function arraymod<T extends unknown[]>(
  ...input: {
    [index in keyof T]: ParamType<T[index]>
  }
): T {
  return input.map(unparam);
}
Run Code Online (Sandbox Code Playgroud)

我想要的是一个执行类似操作的函数。

function takelast<T extends unknown[]>(
  ...input: {
    [index in keyof T]: ParamType<T[index]>
  }
): LastElementOf<T> /* What would this return type be? */ {
  return unparam(input[input.length - 1]);
Run Code Online (Sandbox Code Playgroud)

ParamType<T>只是unparam一些用于说明的示例类型/函数)

如何编写一个类型LastElementOf<T>来给出元组T(或数组,即使这只是任何元素的类型)的最后一个元素的类型。

won*_*ame 6

我们必须使用infer 关键字来实现这个结果。

我们将检查数组以扩展infer最后一项和其余的项,我们不关心这些:

type LastElementOf<T extends readonly unknown[]> = T extends readonly [...unknown[], infer Last]
  ? Last
  : never;
Run Code Online (Sandbox Code Playgroud)

...unknown[]将是除最后一项之外的第一项,最后一项将是infer Last

用法:

type Case1 = LastElementOf<[]>; // never
type Case2 = LastElementOf<['dasd']>; // "dasd'
type Case3 = LastElementOf<['string', 12, false]>; // false
type Case4 = LastElementOf<readonly ['string', 12, false]>; // false
Run Code Online (Sandbox Code Playgroud)

操场