TypeScript: Der reibungslose Übergang von JavaScript zu TypeScript ist wie ein Upgrade Ihres Lego-Bauprozesses!
„Tu, was du kannst, nutze, was du hast“ – das ist eines meiner Mottos. Dieser Satz spiegelt auch einen Teil der Wachstumsmentalität wider. Die meisten von uns Frontend- oder JavaScript-Entwicklern haben bereits mit TypeScript begonnen oder sind vollständig auf TypeScript umgestiegen. Einige Leute haben jedoch möglicherweise immer noch Schwierigkeiten, die Konzepte zu verstehen oder ihre Denkweise von JavaScript auf TypeScript umzustellen. Um dieses Problem zu lösen, werden wir eines meiner Lieblingswerkzeuge verwenden: Legos. Beginnen wir hier: „Stellen Sie sich JavaScript als einen grundlegenden Satz von Legosteinen vor, den Sie frei erstellen können. TypeScript ist derselbe Satz von Bausteinen, jedoch mit detaillierten Anweisungen und Qualitätskontrollprüfungen.“ kann hier, hier und auf dieses Video verwiesen werden. Dieser Leitfaden soll zeigen, wie jedes JavaScript-Konzept in TypeScript übersetzt werden kann. Dabei werden Lego-Analogien verwendet, um Ihnen das Verständnis der Konzepte zu erleichtern.
Variablenbereich bezieht sich auf den Kontext, in dem auf Variablen zugegriffen und diese in einem Programm verwendet werden können. Es gibt zwei Haupttypen von Bereichen: lokaler Bereich und globaler Bereich. Eine außerhalb einer Funktion deklarierte Variable befindet sich im globalen Gültigkeitsbereich, was bedeutet, dass auf sie überall im Code zugegriffen und sie geändert werden kann. Andererseits befinden sich innerhalb einer Funktion deklarierte Variablen im lokalen Gültigkeitsbereich und können nur innerhalb dieser Funktion aufgerufen werden. JavaScript verwendet die Schlüsselwörter var
, let
und const
zum Deklarieren von Variablen, und jedes Schlüsselwort hat eine andere Auswirkung auf den Bereich. Mit let
und const
deklarierte Variablen sind blockbezogen, was bedeutet, dass auf sie nur innerhalb des nächstgelegenen umschließenden Blocks {}
zugegriffen werden kann. Im Gegensatz dazu ist var
funktionsbezogen, sodass es in der gesamten Funktion verfügbar ist, in der es deklariert wird. Ein klares Verständnis des Variablenbereichs hilft, Probleme wie Variablennamenkonflikte und unerwartete Nebenwirkungen in JavaScript-Programmen zu vermeiden.
Beim Hochziehen werden Variablen- und Funktionsdeklarationen an den Anfang ihres enthaltenden Bereichs verschoben, bevor der Code ausgeführt wird (Kompilierungsphase). Dies bedeutet, dass Variablen und Funktionen verwendet werden können, bevor sie deklariert werden. Funktionsdeklarationen werden vollständig hochgehoben, sodass sie bereits aufgerufen werden können, bevor sie im Code definiert werden. Mit var
deklarierte Variablen werden jedoch angehoben, aber nicht auf ihren Anfangswert initialisiert, sodass ein Zugriff auf sie vor der Zuweisung zu undefined
führt. Mit let
und const
deklarierte Variablen werden ebenfalls angehoben, aber nicht initialisiert, was zu ReferenceError
führen würde, wenn vor der Deklaration darauf zugegriffen würde. Das Verständnis von Promotion hilft Entwicklern, häufige Fallstricke zu vermeiden, indem sie Variablen- und Funktionsdeklarationen korrekt erstellen.
Stellen Sie sich Scopes als verschiedene Lego-Räume vor:
<code class="language-javascript">// 全局搭建房间 const globalBricks = "每个人都可以使用这些"; function buildSection() { // 个人搭建桌 var tableBricks = "仅供此搭建者使用"; if (true) { // 特定区域 let sectionBricks = "仅供此部分使用"; } }</code>
<code class="language-typescript">// 为我们的搭建房间添加类型安全 type BrickType = "regular" | "special" | "rare"; const globalBricks: BrickType = "regular"; function buildSection(): void { // TypeScript确保我们只使用有效的积木类型 const tableBricks: BrickType = "special"; if (true) { // TypeScript阻止在此块之外使用sectionBricks let sectionBricks: BrickType = "rare"; } } // 真实世界的例子:配置管理 interface AppConfig { readonly apiKey: string; environment: "dev" | "prod"; features: Set<string>; } const config: AppConfig = { apiKey: "secret", environment: "dev", features: new Set(["feature1", "feature2"]) };</code>
Funktionen sind wiederverwendbare Codeblöcke, die zur Ausführung einer bestimmten Aufgabe entwickelt wurden. Dies verbessert die Modularität und Code-Effizienz. Sie können mit dem Schlüsselwort function
definiert werden, gefolgt von einem Namen, Klammern ()
und einem in geschweiften Klammern eingeschlossenen Codeblock {}
. Argumente können in Klammern oder geschweiften Klammern an eine Funktion übergeben werden, die als Platzhalter für die beim Aufruf der Funktion bereitgestellten Werte dienen. JavaScript unterstützt auch anonyme Funktionen (ohne Namen) und Pfeilfunktionen (für eine sauberere Syntax). Funktionen können die return
-Anweisung verwenden, um einen Wert zurückzugeben, oder Vorgänge ausführen, die keinen Wert zurückgeben. Darüber hinaus sind Funktionen in JavaScript erstklassige Objekte, was bedeutet, dass sie Variablen zugewiesen, als Argumente übergeben und von anderen Funktionen zurückgegeben werden können, wodurch das funktionale Programmiermuster ermöglicht wird.
Abschlüsse sind eine leistungsstarke Funktion, die es einer Funktion ermöglicht, sich ihren lexikalischen Bereich zu merken und darauf zuzugreifen, selbst wenn die Funktion außerhalb dieses Bereichs ausgeführt wird. Abschlüsse können erstellt werden, wenn eine Funktion innerhalb einer Funktion definiert wird und auf Variablen in der äußeren Funktion verweist. Auch nachdem die Ausführung der äußeren Funktion abgeschlossen ist, kann die innere Funktion weiterhin auf diese Variablen zugreifen. Diese Funktion ist nützlich für die Datenkapselung und die Aufrechterhaltung des Status in Umgebungen wie Ereignishandlern oder Rückrufen. Abschlüsse unterstützen Muster wie private Variablen, bei denen Funktionen bestimmtes Verhalten offenlegen und Implementierungsdetails verbergen können.
<code class="language-javascript">function buildHouse(floors, color) { const foundation = "concrete"; return function addRoof(roofStyle) { return `${color} house with ${floors} floors and ${roofStyle} roof on ${foundation}`; }; }</code>
<code class="language-typescript">// 带有类型的基本函数 interface House { floors: number; color: string; roofStyle: string; foundation: string; } // 为我们的搭建者添加类型安全 function buildHouse( floors: number, color: string ): (roofStyle: string) => House { const foundation = "concrete"; return (roofStyle: string): House => ({ floors, color, roofStyle, foundation }); } // 真实世界的例子:组件工厂 interface ComponentProps { id: string; style?: React.CSSProperties; children?: React.ReactNode; } function createComponent<T extends ComponentProps>( baseProps: T ): (additionalProps: Partial<T>) => React.FC<T> { return (additionalProps) => { // 组件实现 return (props) => <div></div>; }; }</code>
Objekte in JavaScript sind grundlegende Datenstrukturen, die als Container für verwandte Daten und Funktionen dienen. Sie bestehen aus Schlüssel-Wert-Paaren, wobei jeder Schlüssel (Eigenschaft) einem Wert zugeordnet ist, der ein beliebiger gültiger JavaScript-Typ sein kann, einschließlich Funktionen (Methoden). Objekte können auf verschiedene Arten erstellt werden:
const obj = {}
new Object()
Object.create()
MethodeDas Prototypsystem ist der in JavaScript integrierte Vererbungsmechanismus. Jedes Objekt verfügt über eine interne Verbindung zu einem anderen Objekt, die als Prototyp bezeichnet wird. Beim Versuch, auf eine Eigenschaft zuzugreifen, die in einem Objekt nicht vorhanden ist, sucht JavaScript automatisch danach in seiner Prototypenkette. Diese Objektkette wird fortgesetzt, bis sie ein Objekt mit dem null
-Prototyp erreicht, normalerweise Object.prototype
. Das Verständnis von Prototypen ist entscheidend für:
Stellen Sie sich solche Objekte und Prototypen vor:
<code class="language-javascript">// 全局搭建房间 const globalBricks = "每个人都可以使用这些"; function buildSection() { // 个人搭建桌 var tableBricks = "仅供此搭建者使用"; if (true) { // 特定区域 let sectionBricks = "仅供此部分使用"; } }</code>
<code class="language-typescript">// 为我们的搭建房间添加类型安全 type BrickType = "regular" | "special" | "rare"; const globalBricks: BrickType = "regular"; function buildSection(): void { // TypeScript确保我们只使用有效的积木类型 const tableBricks: BrickType = "special"; if (true) { // TypeScript阻止在此块之外使用sectionBricks let sectionBricks: BrickType = "rare"; } } // 真实世界的例子:配置管理 interface AppConfig { readonly apiKey: string; environment: "dev" | "prod"; features: Set<string>; } const config: AppConfig = { apiKey: "secret", environment: "dev", features: new Set(["feature1", "feature2"]) };</code>
Asynchrone Funktionen sind ein spezieller Funktionstyp in JavaScript, der eine elegante Möglichkeit zur Handhabung asynchroner Vorgänge bietet. Wenn diese Funktionen mit dem Schlüsselwort async
deklariert werden, geben sie automatisch ein Promise zurück und ermöglichen die Verwendung des Schlüsselworts await
in ihrem Hauptteil. Der await
-Operator unterbricht die Ausführung einer Funktion, bis das Versprechen aufgelöst oder abgelehnt wird, sodass asynchroner Code in einem synchroneren und lesbareren Stil geschrieben werden kann. Diese Syntax reduziert effektiv die Komplexität von Rückrufen und macht verschachtelte Promise-Ketten überflüssig. In async function fetchData() { const response = await fetch(url); }
wartet die Funktion beispielsweise auf den Abschluss des fetch
-Vorgangs, bevor sie mit der Ausführung fortfährt. Dadurch wird das Verhalten des Codes vorhersehbarer und gleichzeitig sichergestellt, dass der Hauptthread nicht blockiert bleibt. Dieses Muster ist besonders nützlich, wenn es um mehrere voneinander abhängige asynchrone Vorgänge geht, da es Entwicklern ermöglicht, Code zu schreiben, der die Reihenfolge der Vorgänge klar zum Ausdruck bringt, ohne die Leistung zu beeinträchtigen.
Versprechen stellt einen Wert dar, der jetzt, in der Zukunft oder nie verfügbar sein kann. Es handelt sich um ein Objekt mit drei möglichen Status: Ausstehend, Abgeschlossen oder Abgelehnt. Es wird zur Abwicklung asynchroner Vorgänge verwendet. Versprechen verfügen über Methoden wie .then()
, .catch()
und .finally()
zum Verketten von Aktionen basierend auf dem Ergebnis. Dies macht sie zu einer leistungsstarken Alternative zu verschachtelten Rückrufen und verbessert die Lesbarkeit des Codes und die Fehlerbehandlung.
<code class="language-javascript">// 全局搭建房间 const globalBricks = "每个人都可以使用这些"; function buildSection() { // 个人搭建桌 var tableBricks = "仅供此搭建者使用"; if (true) { // 特定区域 let sectionBricks = "仅供此部分使用"; } }</code>
<code class="language-typescript">// 为我们的搭建房间添加类型安全 type BrickType = "regular" | "special" | "rare"; const globalBricks: BrickType = "regular"; function buildSection(): void { // TypeScript确保我们只使用有效的积木类型 const tableBricks: BrickType = "special"; if (true) { // TypeScript阻止在此块之外使用sectionBricks let sectionBricks: BrickType = "rare"; } } // 真实世界的例子:配置管理 interface AppConfig { readonly apiKey: string; environment: "dev" | "prod"; features: Set<string>; } const config: AppConfig = { apiKey: "secret", environment: "dev", features: new Set(["feature1", "feature2"]) };</code>
Dies ist eine praktische Möglichkeit, Werte aus einem Array oder Eigenschaften aus einem Objekt in verschiedene Variablen zu extrahieren. Bei der Array-Destrukturierung werden eckige Klammern []
verwendet, während bei der Objektdestrukturierung geschweifte Klammern {}
verwendet werden. Diese Syntax reduziert den Bedarf an doppeltem Code, indem Werte direkt in Variablen entpackt werden, was den Umgang mit komplexen Datenstrukturen erleichtert. Beispielsweise weist const [a, b] = [1, 2]
a 1 und b 2 zu, während const { name } = person
das Namensattribut aus dem Personenobjekt extrahiert.
Der Spread-Operator wird durch drei Punkte (...) dargestellt. Es ermöglicht die Erweiterung iterierbarer Objekte wie Arrays oder Objekte, wenn mehrere Elemente oder Schlüssel-Wert-Paare erforderlich sind. Es kann zum Kopieren, Kombinieren oder Übergeben von Array-Elementen als Funktionsargumente verwendet werden. Zum Beispiel const arr = [1, 2, ...anotherArray]
.
Optionale Ketten werden durch ?.
dargestellt. Es bietet eine sichere Möglichkeit, auf tief verschachtelte Objekteigenschaften zuzugreifen, ohne Fehler zu verursachen, wenn die Eigenschaft undefiniert oder null ist. Wenn die Referenz null ist, wird sie kurzgeschlossen und sofort undefiniert zurückgegeben. Beispielsweise prüft user?.address?.street
, ob Benutzer und Adresse vorhanden sind, bevor auf die Straße zugegriffen wird. Diese Syntax verhindert Laufzeitfehler und macht die Arbeit mit verschachtelten Datenstrukturen sauberer und weniger fehleranfällig, insbesondere bei APIs oder Daten, die auf Benutzereingaben basieren.
<code class="language-javascript">function buildHouse(floors, color) { const foundation = "concrete"; return function addRoof(roofStyle) { return `${color} house with ${floors} floors and ${roofStyle} roof on ${foundation}`; }; }</code>
<code class="language-typescript">// 带有类型的基本函数 interface House { floors: number; color: string; roofStyle: string; foundation: string; } // 为我们的搭建者添加类型安全 function buildHouse( floors: number, color: string ): (roofStyle: string) => House { const foundation = "concrete"; return (roofStyle: string): House => ({ floors, color, roofStyle, foundation }); } // 真实世界的例子:组件工厂 interface ComponentProps { id: string; style?: React.CSSProperties; children?: React.ReactNode; } function createComponent<T extends ComponentProps>( baseProps: T ): (additionalProps: Partial<T>) => React.FC<T> { return (additionalProps) => { // 组件实现 return (props) => <div></div>; }; }</code>
Der Übergang von JavaScript zu TypeScript ist wie ein Upgrade Ihres Lego-Bauprozesses:
JavaScript (Grundkonstruktion):
TypeScript (professionell erstellt):
Wichtige Übergangstipps:
Denken Sie daran: TypeScript baut auf Ihren JavaScript-Kenntnissen auf und sorgt für mehr Sicherheit und Klarheit, anstatt den grundlegenden Erstellungsprozess zu ändern. Trotzdem ist mein Rat immer noch: Lernen Sie zuerst JavaScript und dann TypeScript.
Das obige ist der detaillierte Inhalt vonBauen mit TypeScript: Ein Lego-basierter Leitfaden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!