Im vorherigen Teil dieser Beitragsreihe haben wir über die sichere Nullbarkeit gesprochen.
Jetzt erklären und lösen wir das dritte und letzte Problem des TypeScript-Standardverhaltens:Überreste der dynamischen Typisierung.
Wir werden Folgendes behandeln:
TypeScript soll ein „statischer Typprüfer“ sein, im Gegensatz zu JavaScript, bei dem die Eingabe sehr dynamisch ist.
Aber in einem früheren Teil dieser Beitragsreihe haben wir auch erklärt, dass TypeScript als Obermenge von JavaScript aufgebaut ist.
Das Problem ist also:Einige Teile des dynamischen JavaScript-Schreibsystems verbleiben in TypeScript. Wir werden daher erklären, wie man diese verbleibenden Verhaltensweisen unterdrückt, um eine vollständige statische Eingabe zu erreichen.Tatsächliche Gleichheitsprüfungen
ESLint: eqeqeq, sondern eine Äquivalenzprüfung:
1 == "1"; // true
Diese Äquivalenzprüfungen sind nur in einer dynamisch typisierten Sprache wie JavaScript sinnvoll. Von dem Moment an, in dem wir uns entscheiden, in TypeScript zu arbeiten, sollten nur noch tatsächliche Gleichheitsprüfungen (Typ und Wert) verwendet werden.
1 === "1"; // false
Menschen, die Sprachen wie Java, C# oder Rust verwenden, sollten mit diesem Problem besonders vorsichtig sein, da == in JavaScript oder TypeScript nicht dasselbe bedeutet wie in diesen Sprachen. In JavaScript und TypeScript ist ein drittes = erforderlich, um das gleiche Verhalten zu erreichen.
Keine impliziten Konvertierungen in Bedingungen
ESLint: @typescript-eslint/strict-boolean-expressionslet tax: number | undefined = 0; if (tax) { console.log("Process payment"); } if (!tax) { throw new Error(); }
let tax: number | undefined = 0; if (tax == true) { console.log("Process payment"); } if (tax == false) { throw new Error(); }
Die Lint-Regel „strict-boolean-expressions“ verbietet solche impliziten Bedingungen und erzwingt tatsächliche Prüfungen:
let tax: number | undefined = 0; if (tax !== undefined) { console.log("Process payment"); } if (tax === undefined) { throw new Error(); }
Wie im Konfigurationsteil gezeigt, ist das Deaktivieren der Unteroptionen „allowNumber“ und „allowString“ wichtig, um alle Fehler zu vermeiden.
Die einzige zulässige Ausnahme gilt für Objekte und Arrays: Diese Fälle sind sicher, da sie im Gegensatz zu Zeichenfolgen und Zahlen keine falschen Werte haben. Folgendes ist also noch in Ordnung:
let movie: Movie | undefined; if (movie) {} if (!movie) {}
Kurzschrift für Bedingungen
ESLint: @typescript-eslint/prefer-nullish-coalescing (in stilistischer Typprüfung)const movieRating = userRating || 5; // Which is a shorter version of: const movieRating = userRating == true ? userRating : 5;
Es kann mit modernem JavaScript vermieden werden:
const movieRating = userRating ?? 5; // Which is a shorter version of: const movieRating = userRating !== undefined && userRating !== null ? userRating : 5;
Beachten Sie, dass ?? sollte nicht überall verwendet werden: || ist immer noch relevant, wenn mit Booleschen Werten gearbeitet wird.
Keine Vermischung von Zeichenfolgen und Zahlen
ESLint:"There is " + 3 + 1 + "Matrix movies"; // 31 "There is " + (3 + 1) + "Matrix movies"; // 4
Template strings from modern JavaScript should be used for string concatenation, which the prefer-template lint rule enforces:
const movie = `Everything everywhere all at once`; `${movie} is the best movie!`;
Conversely, only strings should be used in template strings, which the restrict-template-expressions lint rule enforces.
If mixing types is what is actually wanted, conversions should be explicit:
const total = 3; `There is ${total.toFixed()} Matrix movies`;
Note that template strings can be nested:
const total = 3; `There is ${total.toFixed()} Matrix movie${total > 1 ? "s" : ""}`;
This is the end of this posts series. You can follow my account (button on top right of this page) to know when other posts about TypeScript or other topics like Angular are published.
You want tocontact me? Instructions are available in the summary.
Das obige ist der detaillierte Inhalt vonTypeScript streng typisiert – Teilweise vollständig statische Typen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!