Metodöverladdning i härledda klasser i Typescript


Det jag har i åtanke är ganska enkelt:

class A {
    getSomething(name: string): number {
        return 1;
    }

 }

class B extends A {
    getSomething(n: number, name: string): number {
        return 2;
    }
}

En metod som definieras i en klass bör överlagras med en ytterligare parameter i en underklass. I verkligheten kommer metoden i klass B att gå via A beroende på den nya parametern. Men jag får felet:

Klass 'B' utökar felaktigt basklassen 'A'. Typerna för egenskapen 'getSomething' är inkompatibla. Typen '(n: number, name: string) => number' kan inte tilldelas typen '(name: string) => number'.

Se denna kod i lekplatsen. Vad skulle vara rätt tillvägagångssätt här? Är detta alls möjligt?

Svar #1

Du kan uttryckligen deklarera de överlagrade funktionssignaturerna:

class A {
    getSomething(name: string): number {
        return 1;
    }

 }

class B extends A {
    getSomething(name: string): number;
    getSomething(n: number, name: string): number;

    getSomething(n, name?) {
        return 2;
    }
}

REDIGERA

Med det ovanstående överskrider du också den ursprungliga funktionen. Det är ditt ansvar att kalla på superklassens funktion när parametrarna ges på det sättet. Ett exempel:

class A {
    getSomething(name: string): number {
        return 1;
    }
 }

class B extends A {
    getSomething(name: string): number;
    getSomething(n: number, name: string): number;

    getSomething(n: any, name?: any): any {
        if (typeof name !== "string") { 
            return super.getSomething(n);
        } 
        return 2;
    }
}