unknown
In der Lektion über Basistypen hast du any kennengelernt, das die Typprüfung abschaltet: TypeScript erlaubt alles, und die Fehler von JavaScript kommen zurück. Manchmal weißt du aber wirklich nicht, was ein Wert ist. Daten, die von außerhalb des Programms kommen, etwa ein Spielstand, eine Datei oder eine Nachricht von einem Server, können alles enthalten: vielleicht die Zahl, die du erwartest, vielleicht einen Text, vielleicht gar nichts.
Für solche Werte hat TypeScript den Typ unknown. Wie any akzeptiert er jeden Wert. Anders als any lässt er dich mit dem Wert nichts anfangen, bis du herausgefunden hast, was er ist:
const gespeicherterName: unknown = "Kira";
console.log(gespeicherterName);
console.log(gespeicherterName.toUpperCase());main.ts(3,13): error TS18046: 'gespeicherterName' is of type 'unknown'.Ausgeben ist in Ordnung, weil console.log alles akzeptiert. Eine Methode aber nicht: Der Wert könnte eine Zahl sein, und dann würde das Programm abstürzen. Du kannst ein unknown auch nicht in einer Variablen eines anderen Typs speichern: const heldenName: string = gespeicherterName; ergibt error TS2322: Type 'unknown' is not assignable to type 'string'.
Du kommst an den Wert heran, indem du ihn mit den Prüfungen eingrenzt, die du kennst:
const gespeicherterName: unknown = "Kira";
if (typeof gespeicherterName === "string") {
console.log(gespeicherterName.toUpperCase());
} else {
console.log("Die Speicherdatei enthält keinen Namen");
}Das gibt aus:
KIRAInnerhalb des if ist gespeicherterName ein string, und alles, was für Texte funktioniert, ist erlaubt. Das ist der ganze Unterschied zwischen den beiden Typen. Mit any kannst du die Prüfung vergessen, und das Programm stürzt ab, wenn es läuft (mit const gespeicherterName: any = 42; endet der Aufruf mit TypeError: gespeicherterName.toUpperCase is not a function). Mit unknown kannst du sie nicht vergessen: TypeScript verlangt die Prüfung.
Wenn du den Typ eines Werts nicht kennst, schreibe also unknown, nicht any. Und wenn du in einem Programm any siehst, frage dich, ob ein echter Typ oder wenigstens unknown nicht genügt.
So schreibst du es:
Anweisungen
- 1
Das Programm gibt
130,4510,10und11aus. Die zweite Zahl ist falsch: Das gespeicherte Gold war der Text"45", und"45" + 10ergibt den Text"4510".anyhat das Problem versteckt. Ändere den Typ vongespeichertinunknown, und TypeScript meldet dasreturn. Behebe die Funktion: Wenngespeicherteine Zahl ist, gib sie zurück; sonst gib vorerst0zurück. Das Programm gibt dann130und dreimal10aus. - 2
Füge eine weitere Prüfung hinzu: Wenn
gespeichertein Text ist, gibNumber(gespeichert)zurück. Das Programm gibt dann aus:130 55 10 10