TypeScript ondersteunt de operator typeof niet alleen tijdens uitvoering (zoals in JavaScript), maar ook tijdens compilatie voor het afleiden van het type van een expressie. Dit maakt het mogelijk om het type van een al gedeclareerde variabele, functie of objectstructuur te verkrijgen, wat de type-afbakening flexibel maakt en de kans op duplicatie en desynchronisatie van types vermindert.
Oorspronkelijk werd de operator typeof in JavaScript gebruikt om het type van een waarde op runtime te bepalen. TypeScript heeft dit mechanisme uitgebreid — nu creëert typeof tijdens de compilatie een verwijzing naar het type van de waarde van de variabele of het resultaat van de functie. Dit is uiterst nuttig bij het werken met complexe structuren, configuraties, en bij het hergebruiken van type tussen modules.
Bij handmatige type-aanduiding is het gemakkelijk om een fout te maken: de definitie van de structuur wijzigen en vergeten om de type- of interface-aankondiging bij te werken, of types verkeerd kopiëren tussen objecten. Dit leidt tot desynchronisatie van de code en uitvoeringsfouten. Bij het gebruik van typeof wordt het type dynamisch afgeleid en komt het altijd overeen met de actuele datastructuur.
Voor het declareren van een variabele met een type dat overeenkomt met een al bestaande structuur of constante, gebruikt men de operator typeof:
const config = { host: "localhost", port: 8080, }; let serverCfg: typeof config; // Type serverCfg is hetzelfde als van config
Voor het typeren van een functie die een bepaalde structuur retourneert:
function makeUser() { return { id: 1, name: "Alex" }; } type User = ReturnType<typeof makeUser>; // User: {id: number; name: string;}
Belangrijke kenmerken:
typeof in TS retourneert het type van de waarde van een variabele of resultaat van een expressie tijdens compilatie.ReturnType, Parameters), evenals met keyof voor het verkrijgen van een lijst van sleutelwaarden van een object.Wordt de operator typeof in TypeScript tijdens uitvoering uitgevoerd?
Nee, de type typeof werkt alleen tijdens compilatie en komt niet in de runtime-code, hoewel de JavaScript-operator typeof ook in runtime bestaat.
Kan typeof worden gebruikt voor het afleiden van het type van klassenattributen?
Ja, maar alleen als het attribuut al is gedeclareerd als statisch of met een initiële waarde, anders zal er een fout optreden. Voor private/public protected — worden alleen publieke attributen/metodes in overweging genomen.
Is er een verschil tussen 'let x: typeof y;' en 'let x = y;'?
Type-technisch gezien — in beide gevallen zal de compiler automatisch het type afleiden. Echter, 'typeof' kan worden gebruikt voor het schrijven van type-aankondigingen zonder initialisatie of voor meer complexe combinaties met utilitaire types.
typeof voor de gebruikelijke js-typercoursen typeof x === 'string' — dat is runtime, en geen compileerbaar type.In een project wordt een groot configuratie-object apart beschreven als type, apart als variabele. Bij het wijzigen van de structuur vergeten ze het type bij te werken, wat leidt tot fouten in de API-werking.
Voordelen: Flexibel werken met types, kan types opnieuw definiëren via type of interface
Nadelen: Groot risico op desynchronisatie van structuur en types, slechte onderhoudbaarheid
Gebruik van typeof voor het verkrijgen van het actuele type van de objectstructuur bij het declareren van nieuwe variabelen en bij het genereren van het type voor de API-interface.
Voordelen: Type komt altijd overeen met de waarde, lage kans op fouten, goede autocompletion
Nadelen: Als het object erg complex is, kan het uiteindelijke type verwarrend zijn om te lezen voor nieuwkomers