【问题标题】:Remove item from inferred parameters tuple从推断参数元组中删除项目
【发布时间】:2021-01-24 07:05:42
【问题描述】:

如果我有:

const selector = (state: {}, count = 1) => {};
type parms = Parameters<typeof selector>;

那么parms 将是:

[{}, number?]

我注意到,如果我应用索引,我可以提取单个参数:

type parms = Parameters<typeof selector>[1]; // type parms = number

有什么方法可以表明我想省略返回的第一个参数?类似于.slice(1) 的东西?

【问题讨论】:

标签: typescript


【解决方案1】:

对于“从元组中删除第一个元素”的具体情况,可以使用 TypeScript 4.0 中介绍的variadic tuple types

type Tail<T extends any[]> = T extends [infer A, ...infer R] ? R : never;

在 4.0 之前,您可以使用 generic rest parameters

type Tail<T extends any[]> = 
  ((...x: T) => void) extends ((h: infer A, ...t: infer R) => void) ? R : never;

无论哪种方式都可以为您提供所需的行为:

type Test = Tail<[1,2,3,4,5]>; // [2,3,4,5]
type Parms = Tail<Parameters<typeof selector>>; // [number?]

Playground link to code

【讨论】:

  • 感谢@jcalz,这可行,但我承认我发现它有点密集。看来您推断出第一个参数,然后通过扩展推断其余参数,但要这样做,我们必须检查 (...x: T) =&gt; void) 胖箭头函数是否扩展了 (h: infer A, ...t: infer R) =&gt; void) 是否有什么地方可以找到解释这个概念的地方?
  • 这是使用type inference in conditional types 拉出其余类型。我们真的不想做检查(我们知道检查会通过);只是条件类型是 TypeScript 提供执行此类推理的唯一句柄。
  • 我特别喜欢的是,我也可以将上面的调整为h: State,以确保我Tailing的功能符合我对第一个参数应该是什么的期望。再次感谢!
猜你喜欢
  • 2021-10-19
  • 2021-10-03
  • 1970-01-01
  • 2014-09-21
  • 2018-02-15
  • 1970-01-01
  • 2013-06-08
  • 2020-07-01
相关资源
最近更新 更多