TypeScript-Interviews prüfen, ob du das Typsystem verstehst – nicht nur die Syntax. Unten findest du 20 Fragen mit Antworten, von den Grundlagen bis zu denen, die Leute trennen, die TypeScript benutzen, von denen, die wissen, warum es funktioniert. Der Code wurde vor der Veröffentlichung mit dem TypeScript-Compiler im Strict-Modus kompiliert, und die zitierten Fehlermeldungen sind die echten.
Grundlagen
1. Was fügt TypeScript JavaScript hinzu?
Ein statisches Typsystem, das zur Kompilierzeit geprüft und dann entfernt wird. Die Ausgabe ist reines JavaScript, also haben Typen keine Laufzeitkosten und keine Laufzeitpräsenz. Der letzte Punkt ist wichtig: Du kannst einen Typ zur Laufzeit nicht mit typeof prüfen, es sei denn, du schreibst die Prüfung selbst.
2. Was ist der Unterschied zwischen type und interface?
Beide beschreiben Objektformen und funktionieren oft austauschbar. Die praktischen Unterschiede:
| interface | type | |
|---|---|---|
| Declaration Merging | Ja, zwei Deklarationen werden zusammengeführt | Nein, ein doppelter Name ist ein Fehler |
| Unions und Primitive | Kann sie nicht ausdrücken | Kann sie ausdrücken, etwa eine Union aus number und string |
| Erweitern | extends | Schnittmenge mit & |
| Mapped und Conditional Types | Nein | Ja |
Wenn du interface A zweimal deklarierst, werden die Felder zusammengeführt. Wenn du type B zweimal deklarierst, erhältst du error TS2300: Duplicate identifier 'B'. Eine gängige Faustregel: Verwende interface für öffentliche Objektformen, die andere erweitern könnten, und type für alles andere.
3. Was ist der Unterschied zwischen any, unknown und never?
- any schaltet die Prüfung ab. Alles ist erlaubt, und Fehler verstecken sich.
- unknown ist die sichere Variante. Du kannst alles darauf zuweisen, musst es aber vor der Verwendung eingrenzen. Der Aufruf x.toFixed() auf einem unknown schlägt fehl mit error TS18046: 'x' is of type 'unknown'.
- never ist der Typ von Werten, die nicht existieren können, etwa eine Funktion, die immer wirft. Er ist nützlich für Exhaustive Checks.
Bevorzuge unknown gegenüber any für Werte, deren Typ du nicht kontrollierst, etwa geparstes JSON.
4. Was macht der strict-Modus?
Er aktiviert eine Gruppe von Prüfungen, vor allem strictNullChecks (sodass null und undefined eigene Typen sind) und noImplicitAny. Damit ergibt die Verwendung eines optionalen Werts ohne Prüfung error TS18048: 'x' is possibly 'undefined'. Neue Projekte sollten mit aktiviertem strict starten.
5. Was ist der Unterschied zwischen readonly und const?
const verhindert, dass eine Variable neu zugewiesen wird. readonly verhindert, dass eine Eigenschaft zugewiesen wird. Das Schreiben auf eine readonly-Eigenschaft ergibt error TS2540: Cannot assign to 'n' because it is a read-only property. Keines von beiden macht das zugrunde liegende Objekt tief unveränderlich.
Typen in der Praxis
6. Was sind Union-Typen und wie grenzt du sie ein?
Eine Union bedeutet „einer dieser Typen". Die Eingrenzung nutzt Prüfungen, die der Compiler versteht:
type Id = number | string;
function describe(id: Id): string {
if (typeof id === "string") return id.toUpperCase();
return id.toFixed(1);
}
Innerhalb des if ist id ein string. Danach weiß der Compiler, dass es ein number ist. Weitere Werkzeuge zur Eingrenzung sind instanceof, der in-Operator, Gleichheitsprüfungen und eigene Type Guards.
7. Was ist eine Discriminated Union?
Eine Union, bei der jedes Mitglied ein gemeinsames Literal-Feld hat, das Diskriminante, das sie voneinander unterscheidet:
type Shape =
| { kind: "circle"; r: number }
| { kind: "sq"; s: number };
function assertNever(x: never): never {
throw new Error("unexpected " + x);
}
function area(s: Shape): number {
switch (s.kind) {
case "circle": return Math.PI * s.r ** 2;
case "sq": return s.s ** 2;
default: return assertNever(s);
}
}
Wenn du später eine neue Form hinzufügst und einen case vergisst, lässt sich der default-Zweig nicht mehr kompilieren, weil s nicht mehr never ist. Das ist ein Exhaustive Check.
8. Was sind Generics und warum verwendet man sie?
Sie ermöglichen es einer Funktion oder einem Typ, über viele Typen zu arbeiten und dabei die Beziehung zwischen ihnen zu erhalten:
function first<T>(xs: T[]): T | undefined { return xs[0]; }
function pick<T, K extends keyof T>(o: T, k: K): T[K] { return o[k]; }
first([1, 2]) gibt number | undefined zurück, nicht any. pick(user, "name") gibt den Typ von name zurück. Die Einschränkung extends keyof T verhindert, dass du einen Schlüssel übergibst, der nicht existiert.
9. Was sind die gängigen Utility-Typen?
| Utility | Was es macht |
|---|---|
| Partial<T> | Macht jede Eigenschaft optional |
| Required<T> | Macht jede Eigenschaft erforderlich |
| Readonly<T> | Macht jede Eigenschaft readonly |
| Pick<T, K> | Behält nur die aufgeführten Schlüssel |
| Omit<T, K> | Entfernt die aufgeführten Schlüssel |
| Record<K, V> | Ein Objekttyp mit Schlüsseln K und Werten V |
| ReturnType<F> | Der Rückgabetyp eines Funktionstyps |
10. Was sind Mapped Types?
Sie bauen einen neuen Typ, indem sie über die Schlüssel eines anderen iterieren. Partial selbst ist geschrieben als { [K in keyof T]?: T[K] }. Wenn du das weißt, zeigst du, dass du Utility-Typen verstehst, statt sie auswendig zu lernen.
11. Was ist as const?
Es weist den Compiler an, den engsten Typ abzuleiten und alles als readonly zu markieren. const arr = [1, 2, 3] as const hat den Typ readonly [1, 2, 3], und arr.push(4) schlägt fehl mit error TS2339: Property 'push' does not exist on type 'readonly [1, 2, 3]'. Es ist nützlich für Listen erlaubter Werte und für Konfigurationsobjekte.
12. Was ist eine Type Assertion und wann ist sie gefährlich?
value as Type sagt dem Compiler, dass er dir vertrauen soll. Es findet keine Prüfung zur Laufzeit statt. Wenn du dich irrst, zeigt sich der Fehler später als Absturz. Bevorzuge die Eingrenzung mit einer Prüfung oder einer Type-Guard-Funktion gegenüber einer Assertion.
Sprachverhalten
13. Was ist der Unterschied zwischen null und undefined?
undefined bedeutet, dass einer Variable nie ein Wert zugewiesen wurde, während null für einen absichtlich gesetzten „kein Wert" steht. Mit strictNullChecks sind sie separate Typen. Verwende Optional Chaining (a?.b) und Nullish Coalescing (a ?? b), um sie zu behandeln. Anders als || greift ?? nur bei null und undefined, sodass 0 und der leere String erhalten bleiben.
14. Was ist die Non-Null-Assertion !?
value! teilt dem Compiler mit, dass ein Wert nicht null oder undefined ist. Wie as wird sie nicht geprüft. An einigen Stellen, an denen du es besser weißt als der Compiler, ist sie in Ordnung, aber eine Laufzeitprüfung ist meist sicherer.
15. Was macht keyof, und was ist typeof in einer Typ-Position?
keyof T erzeugt die Union der Eigenschaftsnamen von T. In einer Typ-Position nimmt typeof x den Typ eines Werts an, was vermeidet, ihn zu wiederholen. Zusammen ergibt keyof typeof obj die Schlüssel eines Objekts, das du als Wert definiert hast.
16. Wie schneiden Enums im Vergleich zu Union-Typen ab?
Enums erzeugen ein Laufzeitobjekt und Werte. Eine Union aus String-Literalen wie "idle" | "loading" wird zur Kompilierzeit entfernt und benötigt keinen zusätzlichen Code. Viele Teams bevorzugen String-Literal-Unions wegen ihrer Einfachheit und verwenden Enums, wenn sie das Laufzeitobjekt brauchen.
Tooling und echte Projekte
17. Was macht tsconfig.json, und welche Optionen sind wichtig?
Sie teilt dem Compiler mit, welche Dateien eingeschlossen und wie sie geprüft werden sollen. Optionen, nach denen Interviewer fragen: strict, target (die auszugebende JavaScript-Version), module und moduleResolution, noEmit (nur prüfen, was üblich ist, wenn ein anderes Tool baut), esModuleInterop und skipLibCheck.
18. Wie typisiert man etwas, das von außen kommt, etwa eine API-Antwort?
Typen verschwinden zur Laufzeit, daher kann der Compiler nicht überprüfen, was das Netzwerk zurückgibt. Behandle die Daten als unknown und validiere sie dann mit einer Schema-Bibliothek oder einem handgeschriebenen Type Guard, bevor du sie verwendest. Einen Typ auf geparstes JSON zu assertieren, verdeckt Bugs.
19. Wie migriert man ein JavaScript-Projekt zu TypeScript?
Mach es schrittweise. Füge eine tsconfig.json mit allowJs hinzu, benenne Dateien eine nach der anderen um, aktiviere strengere Optionen nach und nach und füge Typen zuerst an den Grenzen hinzu, etwa bei API-Clients und geteilten Utilities. Vermeide einen Big-Bang-Rewrite.
20. Was ist strukturelle Typisierung?
TypeScript vergleicht Typen nach ihrer Form, nicht nach ihrem Namen. Wenn ein Objekt die Felder hat, die ein Typ erfordert, wird es akzeptiert, selbst wenn es nie als dieser Typ deklariert wurde. Das unterscheidet sich von Sprachen mit nominaler Typisierung, bei der der deklarierte Name zählt.
Wie du dich vorbereitest
- Öffne einen Playground oder ein kleines Projekt im Strict-Modus und probiere jedes der obigen Beispiele aus, auch die, die fehlschlagen sollten.
- Sei bereit, eine generische Funktion und eine diskriminierte Union aus dem Gedächtnis zu schreiben.
- Wisse, warum du unknown statt any wählen würdest.
- Bereite eine Geschichte darüber vor, wie du in einem echten Projekt etwas Unhandliches typisiert hast.
Für verwandte Übung sieh dir unsere Leitfäden zu Node.js-Interviewfragen, Angular-Interviewfragen und Python-Interviewfragen an.
Übe laut und in deinen eigenen Worten. Ein Transkript im Anschluss zeigt, wo du abgeschweift bist oder den Punkt verfehlt hast. Befolge die Regeln des Arbeitgebers zu KI-Tools in jedem Live-Interview oder Assessment.
Üben Sie Ihre Antworten mit YesToTheOffer
Üben Sie laut, erhalten Sie Antworten, die auf Ihrem eigenen Lebenslauf basieren, und überprüfen Sie anschließend Ihr Transkript. 30 kostenlose Minuten, kein Abonnement.



