【问题标题】:Typescript signature for function which increases tuple arity [duplicate]增加元组数量的函数的打字稿签名[重复]
【发布时间】:2019-11-11 16:51:38
【问题描述】:

是否可以在 Typescript 中为函数编写类型感知声明,它接受元组并返回带有附加项的新函数,而不使用函数重载?

简而言之,我需要表达以下功能:

[T1, T2, ... Tn] + U => [T1, T2, ... Tn, U]

除了多重重载之外,还有一个明显的方法:

function append<A, B>(a: [A], b: B): [A, B];
function append<A, B, C>(a: [A, B], c: C): [A, B, C];
function append<A, B, C, D>(a: [A, B, C], d: D): [A, B, C, D];
function append(tuple: any[], b: any): any[] {
  return tuple.concat([b]);
}

有没有办法写成这样的:

function append<T extends any[], U>(t: T, u: U): ??? => ???;

【问题讨论】:

  • 这在有警告的情况下是可行的,如这个重复的问题中所示

标签: typescript dependent-type


【解决方案1】:

我认为这实际上超出了 Typescript 目前的理解范围。考虑完全没有声明返回类型的函数:

function append<U, T extends any[]>(u: U, ...t: T) {
  return [u, ...t];
}

const a = append(4, 'a', 'b')

常量a 显然是[number, string, string] 类型,但3.7.2 编译器认为它是any[]

【讨论】:

  • 是的,这很好,但本质是确保编译器a 属于[number, string, string]
  • 请参阅linked question,了解如何完成带有警告的元组附加。另请注意,您的答案是 prepending 而不是追加,这可以通过在链接问题中使用 Cons 类型的较少警告来完成。
猜你喜欢
  • 2012-11-13
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
相关资源
最近更新 更多