javascript - Hur kan jag ta bort en viss anropssignatur från ett Typescript-gränssnitt med flera anropssignaturer?


Problembeskrivning

Jag skulle vilja börja med ett gränssnitt som har många överlagrade anropssignaturer, och ersätta en av dem med en annan signatur. Detta betyder att jag måste utelämna en viss signatur från basgränssnittet innan jag lägger till dess ersättning.

Mål

Anta att jag börjar med detta gränssnitt:

interface Foo {
  (options: {method: 'authorize', userId: number}): Promise<string>;
  (options: {method: 'deauthorize', authToken: string}): Promise<boolean>;
}

Och jag vill avsluta med detta gränssnitt:

interface Bar {
  (options: {method: 'authorize', userToken: string}): Promise<string>; // NEW
  (options: {method: 'deauthorize', authToken: string}): Promise<boolean>; // UNALTERED
}

Vad jag har försökt

Jag försökte använda Exclude-verktygstypen för att ta bort den oönskade signaturen.

type BaseInterface = Exclude<Foo, (options: {method: 'authorize', userId: number}) => Promise<string>>;

interface Bar extends BaseInterface {
  (options: {method: 'authorize', userToken: string}): Promise<string>;
}

…men det resulterade bara i att BaseInterface blev av typen never.