Fehlende und überflüssige Eigenschaften
Wenn eine Variable einen Typ hat, prüft TypeScript jedes Objekt, das du hineinlegst, Eigenschaft für Eigenschaft. Zwei Fehler passieren ständig: Eine Eigenschaft fehlt, oder es ist eine zu viel. Zuerst eine fehlende:
type Gegenstand = { name: string; preis: number };
const seil: Gegenstand = { name: "Seil" };main.ts(3,7): error TS2741: Property 'preis' is missing in type '{ name: string; }' but required in type 'Gegenstand'.Lies es so: Das Objekt, das du geschrieben hast, hat den Typ { name: string; }, aber Gegenstand verlangt zusätzlich preis. In JavaScript käme das Seil ohne Preis in den Laden, und die Summe eines Einkaufs wäre NaN. Fehlen mehrere Eigenschaften, führt die Meldung alle auf, zum Beispiel Type '{ name: string; }' is missing the following properties from type 'Gegenstand': preis, gewicht (TS2739).
Jetzt eine überflüssige Eigenschaft:
type Gegenstand = { name: string; preis: number };
const seil: Gegenstand = { name: "Seil", preis: 5, gewicht: 2 };main.ts(3,52): error TS2353: Object literal may only specify known properties, and 'gewicht' does not exist in type 'Gegenstand'.Ein Objektliteral ist ein Objekt, das direkt im Code in geschweiften Klammern steht. Eine überflüssige Eigenschaft darin bedeutet meistens eins von zwei Dingen. Entweder fehlt dem Typ eine Eigenschaft, die du brauchst, und du fügst sie dem Typ hinzu, oder die Eigenschaft gehört nicht in das Objekt, und du löschst sie.
Sehr oft ist es ein Tippfehler. TypeScript rät dann, was du gemeint hast:
type Gegenstand = { name: string; preis: number };
const seil: Gegenstand = { name: "Seil", preiss: 5 };main.ts(3,42): error TS2561: Object literal may only specify known properties, but 'preiss' does not exist in type 'Gegenstand'. Did you mean to write 'preis'?Überflüssige Eigenschaften werden nur in Objektliteralen geprüft. Ein Objekt, das schon in einer anderen Variablen steckt, darf mehr Eigenschaften haben, als der Typ braucht. TypeScript verlangt nur, dass es alle Eigenschaften des Typs hat:
type Gegenstand = { name: string; preis: number };
const beute = { name: "Seil", preis: 5, gewicht: 2 };
const seil: Gegenstand = beute;
console.log(seil);Das gibt aus:
{ name: "Seil", preis: 5, gewicht: 2 }So denkt TypeScript über Objekte im Allgemeinen: Ein Objekt ist ein Gegenstand, wenn es alles hat, was ein Gegenstand braucht.
So schreibst du es:
Anweisungen
- 1
Behebe die zwei Monster, die TypeScript meldet. Beim Troll gibt es einen Tippfehler, und dem Goblin fehlt der Schaden: Er richtet 3 an. Das Programm gibt aus:
Wolf: 30 Leben, 6 Schaden Troll: 80 Leben, 12 Schaden Goblin: 20 Leben, 3 Schaden - 2
Eine Spinne kommt in den Wald. Füge unter dem Goblin
const spinne: Monster = { name: "Spinne", leben: 15, schaden: 4, belohnung: 8 };hinzu und gib am Endebeschreibe(spinne)aus. TypeScript meldetbelohnung, das Monster nicht haben. Diesmal fehlt dem Typ etwas: Fügebelohnung: numberzuMonsterhinzu. TypeScript meldet dann die anderen drei Monster, weil sie keine Belohnung haben. Gib ihnen eine: 10 für den Wolf, 40 für den Troll und 5 für den Goblin. Das Programm gibt dann zusätzlichSpinne: 15 Leben, 4 Schadenaus. - 3
Gib am Ende des Programms die Belohnung für alle vier Monster zusammen aus, indem du ihre Eigenschaften
belohnungaddierst:Belohnung: 63 Gold