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);
}
}
}
