鉴于以下情况:
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(使用前将#替换为@)