Aanvankelijk had JavaScript geen strikte typering voor klassen en hun constructors, wat leidde tot runtime-fouten. TypeScript heeft een typesysteem toegevoegd voor veiliger programmeren en ondersteunt de typering van constructors met overerving, wat belangrijk is voor de ontwikkeling van grote toepassingen.
De typering van constructors in TypeScript vereist gelijktijdige overweging van de handtekening van de constructor, het type van het gemaakte exemplaar en de kenmerken van overerving. Problemen ontstaan wanneer de handtekeningen van de constructors in de basis- en afgeleide klasse niet overeenkomen, of wanneer alleen de teruggegeven waarde getypeerd is en niet de invoerparameters van de constructor.
In TypeScript kunnen constructors expliciet worden getypeerd via speciale handtekeningen, met behulp van de expressie new (...args: any[]) => T. Bij overerving is het belangrijk om de handtekeningen consistent te houden en de basisclassen correct uit te breiden.
Codevoorbeeld:
class Animal { constructor(public name: string) {} } class Dog extends Animal { constructor(name: string, public breed: string) { super(name); } } // Type van de constructor function createInstance<T>(C: new (...args: any[]) => T, ...args: any[]): T { return new C(...args); } const dog = createInstance(Dog, 'Rex', 'Labrador');
Belangrijke kenmerken:
Kan ik meerdere constructors in een klasse declareren, zoals in Java of C#?
Nee, TypeScript ondersteunt geen meerdere constructors. Om overbelasting te imiteren, worden handtekeningoverloadingen gebruikt met één implementatie. De juiste aanpak:
class Example { constructor(x: string); constructor(x: number); constructor(x: number | string) { // Eén implementatie } }
Kan ik alleen het teruggegeven type van de constructor typeren, en de parameters negeren?
Nee, de handtekening van de constructor omvat noodzakelijkerwijs parameters. Voorbeeld van juiste typering:
interface Constructable<T> { new (...args: any[]): T; }
Wat gebeurt er als ik in de afgeleide klasse een constructor declareer zonder super aan te roepen?
Er zal een compilatiefout optreden: de constructor van de afgeleide klasse moet super aanroepen voordat hij naar this verwijst.
In het project werd een basis klasse Animal met een constructor (name) gebruikt, en in de afgeleide klasse Dog werd (name, breed) toegevoegd, maar de handtekening werd niet correct uitgebreid.
Voordelen:
Nadelen:
Het type van de constructor is apart opgenomen, de fabriek createInstance is geparametriseerd via CorrectConstructable<T>, de handtekeningen zijn gerespecteerd.
Voordelen:
Nadelen: