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(或数组,即使这只是任何元素的类型)的最后一个元素的类型。
我们必须使用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)
| 归档时间: |
|
| 查看次数: |
263 次 |
| 最近记录: |