typescript - 将类型推到元组的末尾

标签 typescript tuples

我可以在元组的开头添加元素,或者从那里删除它

type ShiftTuple<T extends any[]> = ((...t: T) => void) extends ((x: infer X, ...r: infer R) => void) ? R : never;
type UnshiftTuple<X, T extends any[]> = ((x: X, ...t: T) => void) extends ((...r: infer R) => void) ? R : never;

但是我很难用最后一个元素而不是第一个元素做同样的事情。

即使我写了函数
function f<X, Z extends any[]>(x: X, ...args: Z) {
  return [...args, x]
}

typescript says它返回 any[] .

有没有办法将新类型插入元组的末尾(不支持)
export type PushTuple<T extends any[], X> = [...T, X];

最佳答案

TS4.0+ 更新
TypeScript 4.0 引入 variadic tuple types , 支持 Push以更直接的方式结束元组......像这样:

type Push<T extends readonly any, V> = [...T, V];

TS3.9-的旧答案:
我通常定义 Push就你所说的而言 Unshift (但我称之为 Cons ),如下所示:
type Cons<H, T extends readonly any[]> =
    ((head: H, ...tail: T) => void) extends ((...cons: infer R) => void) ? R : never;

type Push<T extends readonly any[], V>
    = T extends any ? Cons<void, T> extends infer U ?
    { [K in keyof U]: K extends keyof T ? T[K] : V } : never : never;
方式Push<T, V>工作是使元组比 T 长一个元素(它使用 Cons )然后它是 maps over it .它用来自 T 的相应元素填充输出的初始元素。 ,然后剩下的任何东西都会填入 V .长度为 n+1 的映射元组中唯一不是长度为 n 的元组索引的元素索引是索引 n 本身,这意味着新元组的最后一个元素是 V . (我确保 distribute 超过 T,以防它是联合。)
请注意,这仅适用于非边缘情况...不要指望 readonly , optional , 和 rest元组元素或非元组数组表现良好;如果你想定义它,你必须自己解决这些限制。

恢复常规答案:
那么你可以定义 f()像这样:
function f<X, Z extends any[]>(x: X, ...args: Z): Push<Z, X>;
function f(x: any, ...args: any[]): any[] {
    return [...args, x]
}
(请注意,我使用 overload 来让自己不用担心编译器尝试并无法理解实现符合 Push<Z, X> :
它按您的预期工作:
const s = f(4, "hey", false);
// const s: [string, boolean, number]
console.log(s); // ["hey", false, 4]

好的,希望有帮助;祝你好运!
Link to code

关于typescript - 将类型推到元组的末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58546710/

相关文章:

javascript - 如何在 TypeScript 中映射多个类型的数组?

c++ - 将标量 + std::array + std::tuple 转换为大元组

python - 使用 Python 组合正则表达式中的两个列表

python - 将字符串转换为元组对的序列

javascript - 向 typescript 声明动态原型(prototype)方法

带有参数的Angular 5 Component输入函数

javascript - Angular 2 属性注释不编译

typescript - 如何将对象转换为另一种类型并删除 TypeScript 中不需要的字段?

python - Python 中的通配符?

c++ - 在运行时从元组中提要模板函数元素?