ProgrammatieTypeScript-ontwikkelaar

Leg de rol en mechanica van de operator typeof uit in TypeScript voor het typeren van variabelen. Hoe deze te gebruiken voor het afleiden van het type van een variabele of objectstructuur, en in welke gevallen is het de voorkeur boven handmatige type-aanduiding?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

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.

Geschiedenis van de vraag

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.

Probleem

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.

Oplossing

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.
  • Vermijdt duplicatie en desynchronisatie van types.
  • Vaak gecombineerd met aanvullende utilitaire types (ReturnType, Parameters), evenals met keyof voor het verkrijgen van een lijst van sleutelwaarden van een object.

Vragen met een valstrik.

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.

Typefouten en anti-patronen

  • Gebruik van typeof voor de gebruikelijke js-typercoursen typeof x === 'string' — dat is runtime, en geen compileerbaar type.
  • Hergebruik van een waarde van een structuur wanneer alleen de vorm nodig is (het is beter om de structuur in een apart type te zetten).

Voorbeeld uit het leven

Negatieve case

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

Positieve case

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