Häufige Fehler
Ein falsch geschriebenes case-Label
type Text = { type: "text"; body: string };
type Image = { type: "image"; url: string; width: number };
type Attachment = { type: "attachment"; name: string; bytes: number };
type Message = Text | Image | Attachment;
function icon(m: Message): string {
switch (m.type) {
case "text":
return "T";
case "imgae":
return "I";
default:
return "F";
}
}
console.log(icon({ type: "image", url: "/a.png", width: 10 }));
Was tsc oder Node.js ausgibt
main.ts(10,10): error TS2678: Type '"imgae"' is not comparable to type '"attachment" | "image" | "text"'.
Warum, und die Lösung
Ein case-Wert muss einer der Literal-Typen der Diskriminante sein, und tsc zählt die erlaubten auf. Schreiben Sie case "image". Ohne tsc würde das Programm laufen und für jedes Bild still F ausgeben, weil der falsch geschriebene case nie passt.
Die Diskriminante mit let destrukturieren
type Text = { type: "text"; body: string };
type Image = { type: "image"; url: string; width: number };
type Attachment = { type: "attachment"; name: string; bytes: number };
type Message = Text | Image | Attachment;
function link(m: Message): string {
let { type } = m;
if (type === "image") {
return m.url;
}
return "";
}
console.log(link({ type: "image", url: "/a.png", width: 10 }));
Was tsc oder Node.js ausgibt
main.ts(9,14): error TS2339: Property 'url' does not exist on type 'Message'.
Warum, und die Lösung
tsc hält die Verbindung zwischen type und m nur bei einer const (oder einem Parameter, der nie neu zugewiesen wird): Ein let könnte zum Zeitpunkt der Prüfung einen anderen Wert haben. Schreiben Sie const { type } = m; oder prüfen Sie direkt m.type.
Daten destrukturieren, die nur ein Mitglied hat
type Sent = { ok: true; id: number } | { ok: false; error: string };
function report({ ok, id }: Sent): string {
return ok ? "sent #" + id : "failed";
}
console.log(report({ ok: true, id: 7 }));
Was tsc oder Node.js ausgibt
main.ts(3,23): error TS2339: Property 'id' does not exist on type 'Sent'.
Warum, und die Lösung
Ein Destrukturierungsmuster läuft vor jeder Prüfung, also darf es nur Properties nehmen, die jedes Mitglied hat. ok steht in beiden Mitgliedern, id nicht. Nehmen Sie das ganze Objekt, prüfen Sie ok und lesen Sie dann result.id: function report(result: Sent) { return result.ok ? "sent #" + result.id : "failed"; }.
TypeScript im Browser: der Compiler von TypeScript 6.0.3, Apache-2.0, danach die eigene Engine Ihres Browsers. Lizenz und Quellcode