Typescript, extrahera flera anropssignaturer från gränssnitt
Med tanke på följande:
interface Foo {
attr: string;
(a: string): number;
(a: number): number;
}
Hur man skulle skapa en typ som endast väljer funktionsöverlagringar, vilket betyder:
interface Bar {
(a: string): number;
(a: number): number;
}
Jag hittade en lösning när det bara finns en anropssignatur, min situation är när det finns fler än en anropssignatur.
Tack
Svar #1
Det finns inget perfekt sätt att göra detta. Det finns inget stöd för att bara ta bort egenskaperna och versionen som extraherar funktionssignaturer har begränsningar. Vi kan få en version med flera överlagringar att fungera:
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;
// }
Lekplatslänk
Detta kommer fortfarande att ha begränsningen att det inte fungerar för funktioner med generiska typparametrar. Jag tycks också minnas ett fel i kompilatorn som gjorde att ovanstående metod gav problem i vissa hörnfall, men det borde för det mesta fungera.
