In tegenstelling tot veel objectgeoriënteerde talen implementeert TypeScript structurele typisatie (duck typing): een object wordt als compatibel met een type beschouwd als het alle vereiste eigenschappen heeft, ongeacht of het expliciet van dat type is gedeclareerd.
Deze flexibiliteit leidt soms tot onverwachte acceptatie van objecten als type, als de structuur overeenkomt, terwijl ze in feite niet inhoudelijk gerelateerd zijn. Dit is gevaarlijk bij complexe datamodellen, wanneer de structuur toevallig overeenkomt.
Structuur de types van objecten altijd goed, minimaliseer structurele overeenkomsten tussen verschillende entiteiten, en gebruik voor kritieke gevallen extra eigenschappen of symbolen voor de "nominalisatie" van types.
Codevoorbeeld:
interface Punt { x: number; y: number; } interface Pixel { x: number; y: number; } function tekenPunt(p: Punt) { console.log(p.x, p.y); } const pixel: Pixel = { x: 1, y: 2 }; tekenPunt(pixel); // OK, types zijn structureel compatibel
Belangrijke kenmerken:
Als de structuur van twee interfaces overeenkomt, betekent dit dan dat ze volledig uitwisselbaar zijn?
Misschien qua structuur, maar niet qua programmaloogica. Dit is toegestaan op het niveau van de compiler, maar kan leiden tot logische fouten (bijvoorbeeld, Punt en Pixel hierboven).
Is het mogelijk om structurele compatibiliteit voor een bepaald type te verbieden?
Volledig niet, maar het is mogelijk een unieke eigenschap toe te voegen (bijvoorbeeld met een symbool):
interface Merk { _merk: unieke symbool; }
Nu kan een ander object dit type niet imiteren zonder hetzelfde unieke symbool.
Wat is het verschil tussen structurele en nominale typisatie?
Structureel is gebaseerd op de aanwezigheid van structuur, nominaal op de overeenstemming van de type naam in een bepaalde namespace. In TS is de standaard altijd structurele typisatie.
In een aantal entiteiten kwamen velden toevallig overeen (bijvoorbeeld, User en Admin als {id: number, name: string}), wat leidde tot verwarring bij het werken met API-contracten.
Voordelen:
Nadelen:
Gebruik van unieke "labels" symbolen en niet-standaard velden voor het onderscheiden van semantisch verschillende types met een gelijke structuur.
Voordelen:
Nadelen: