Typescript,从接口中提取多个调用签名[重复]

2024-01-07

鉴于以下情况:

interface Foo {
  attr: string;
  (a: string): number;
  (a: number): number;
}

如何创建一种仅选择函数重载的类型,这意味着:

interface Bar {
  (a: string): number;
  (a: number): number;
}

当有时我找到了解决方案只有一个呼叫签名 https://stackoverflow.com/questions/58657325/typescript-pick-call-signature-from-function-interface,我的情况是当有多个呼叫签名时。

Thanks


没有完美的方法可以做到这一点。不支持仅删除属性,并且提取函数签名的版本有限制。我们可以获得一个具有多个重载的版本来工作:

interface Foo {
  attr: string;
  (a: string): number;
  (a: number): number;
}

type JustSignatures<T> =
  T extends { (...args: infer A1): infer R1; (...args: infer A2): infer R2; (...args: infer A3): infer R3; (...args: infer A4): infer R4 } ?
  {
    (...args: A1): R1; (...args: A2): R2; (...args: A3): R3; (...args: A4): R4
  } :
  T extends { (...args: infer A1): infer R1; (...args: infer A2): infer R2; (...args: infer A3): infer R3 } ?
  {
    (...args: A1): R1; (...args: A2): R2; (...args: A3): R3
  } :
  T extends { (...args: infer A1): infer R1; (...args: infer A2): infer R2 } ?
  {
    (...args: A1): R1; (...args: A2): R2
  } :
  T extends { (...args: infer A1): infer R1; } ?
  {
    (...args: A1): R1;
  } :
  never;


type FooSignatures = JustSignatures<Foo>
// type FooSignatures = {
//     (a: string): number;
//     (a: number): number;
// }

这仍然存在不适用于具有泛型类型参数的函数的限制。另外,我似乎还记得编译器中的一个错误,该错误导致上述方法在某些极端情况下出现问题,但它在大多数情况下应该有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Typescript,从接口中提取多个调用签名[重复] 的相关文章

随机推荐