TypeScript overbelastning av klassemetoder - samme returtype, forskjellige parametere


Jeg har en TypeScript-klasse:

class ContactModel {

    public getUsage(type: string): restangular.IElement {
      return this.getBase().one('usages', type);
    }

    public getUsage(customerId: number, type: string): restangular.IElement {
      return this.ModelFactory.createRequestMapper(ContactModel.options)
        .one('customers', customerId).all('contacts/usages', type);
    }

    //...
}

som får kompilatoren til å kaste følgende feil:

>> app/modules/common/model/ContactModel.ts(27,12): error TS2393: Duplicate function implementation.
>> app/modules/common/model/ContactModel.ts(31,12): error TS2393: Duplicate function implementation.

Den eneste forskjellen jeg ser mellom dette eksemplet og TypeScript-håndboken er at deres eksempler har forskjellige returtyper, og jeg har de samme returtypene (begge tilfeller har forskjellige inputparametere).

Spørsmålet er: hva gjør jeg feil - eller trenger TypeScript-klassemetoder å ha forskjellige metodeargumenttyper for å tillate overlasting? Det virker dumt, siden både .Net og Java støtter overlasting med samme returtyper og forskjellige inputtyper.

Svar #1

JavaScript gjør ikke kjøretidstypeinformasjon, så du må gjøre overbelastningsavklaring selv. Merk at i eksemplet i håndboken er det bare én funksjonsimplementering, mens du har to.

class ContactModel {
  public getUsage(type: string): restangular.IElement;
  public getUsage(customerId: number, type: string): restangular.IElement;
  public getUsage(typeOrCustomerId: string|number, type?: string): restangular.IElement {
    if (typeof typeOrCustomerId === 'string') {
      // First overload
      return this.getBase().one('usages', type);
    } else {
      // Second overload
      return this.ModelFactory.createRequestMapper(ContactModel.options)
        .one('customers', customerId).all('contacts/usages', type);
    }
  }
}

Relaterte artikler