Strukturelle Typisierung heißt, dass Kompatibilität über die Form entschieden wird und nicht über den deklarierten Namen, jedes Objekt mit den richtigen Properties erfüllt also den Typ. Das macht Typen billig und kombinierbar, es heißt aber auch, dass zwei unverwandte Konzepte mit gleicher Form austauschbar sind, ein userId-String lässt sich also übergeben, wo ein orderId-String erwartet wird. Der übliche Fix ist ein Branded Type oder ein kleiner Wrapper, der dem Wert eine eigene Form gibt.
Warum Interviewer das fragen
Es trennt Leute, die Annotationen ergänzen, bis die roten Kringel weg sind, von Leuten, die das Typsystem nutzen, um ganze Bugklassen zu verhindern. Der Interviewer prüft, ob du weißt, dass Typen zur Laufzeit gelöscht sind, dass Excess Property Checks nur bei Objektliteralen greifen, und wie man eine Domäne so modelliert, dass falsche Werte nicht darstellbar sind. Es führt meist zu Discriminated Unions und Validierung an der Grenze.
So baust du deine Antwort auf
- Definier strukturelle Typisierung in einem Satz und stell sie nominaler Typisierung gegenüber.
- Nenn den Fehlerfall: zwei identische Formen, die Unterschiedliches bedeuten.
- Erklär den Fix mit Branded Type oder Wrapper.
- Weise darauf hin, dass Typen zur Laufzeit verschwinden, Grenzen also weiterhin Validierung brauchen.
Beispielantwort
Es heißt, dass TypeScript Formen vergleicht und keine Namen, wenn etwas also die richtigen Properties hat, ist es zuweisbar, egal woher es kam. Das ist meistens ein Geschenk, weil sich Typen dadurch wie Dokumentation anfühlen und nicht wie Zeremonie. Es beißt dort, wo zwei Typen dieselbe Form haben, aber unterschiedliche Konzepte sind. Bei mir waren alle IDs schlichte Strings, eine User-ID in eine Funktion zu geben, die eine Order-ID erwartet, kompilierte also einwandfrei und fiel in der Produktion um. Repariert habe ich das mit Branded Types, einer Intersection mit einem eindeutigen Tag, den nur eine Konstruktorfunktion erzeugen kann, damit der Compiler sie nicht mehr als gleich behandelt. Die andere Falle ist, dass Typen gelöscht werden, zur Laufzeit prüft also nichts die Antwort einer API. Alles, was eine Grenze überquert, parse ich mit einem Schema-Validator und lasse den Typ daraus abgeleitet fließen, damit Typ und tatsächliche Daten nicht auseinanderdriften können. Und ich weiß, dass Excess Property Checking nur für frische Objektliterale gilt, was viel Verwirrung darüber erklärt, warum ein zusätzliches Feld mal ein Fehler ist und mal nicht.
Steht dieses Vorstellungsgespräch bald an? GhostPilot hört bei deinem Live-Call mit, erkennt die Frage in dem Moment, in dem sie gestellt wird, und bringt dir eine strukturierte Antwort in Echtzeit auf den Bildschirm. Probier es im nächsten Mock aus, oder hol dir einen $29 Session Pass, kein Abo, für den Ernstfall.
So funktioniert esNachfragen, mit denen du rechnen solltest
- Wie würdest du einen Branded Type ohne Laufzeitkosten umsetzen?
- Wann nutzt du unknown statt any, und was zwingt dich dann zum Narrowing?
- Wie hältst du API-Typen zur Laufzeit ehrlich?
Weitere Fragen für Frontend-Entwickler
Dein Interviewer stellt seine eigene Version davon. Kopier deine echte Stellenbeschreibung in den kostenlosen Question Predictor und bekomm die 20 Fragen, die diese Rolle am wahrscheinlichsten stellt, samt dem, worauf jede wirklich abzielt.
Meine Fragen vorhersagen