Neue TypeScript-Funktionen für verbesserte Benutzerfreundlichkeit

TypeScript ist in vielerlei Hinsicht nicht mehr wie eine Programmiersprache, sondern ein leistungsstarkes Tool zum Flusen und Dokumentieren von Code, mit dem Sie bessere JavaScript-Programme schreiben können.

Eine der bemerkenswertesten Stärken von TypeScript ist die Unterstützung einiger der neuesten Funktionen, die in der ECMAScript-Spezifikation beschrieben sind. Wenn ein Entwickler auf eine neue Version von TypeScript aktualisiert, bedeutet dies, dass er über neue JavaScript-Funktionen verfügt. Darüber hinaus bedeutet die Verwendung dieser Funktionen keine potenziellen Kompatibilitätsprobleme. TypeScript führt nicht nur die neuesten JavaScript-Funktionen ein, sondern zeichnet sich auch dadurch aus, dass die Entwickler der Sprache der TS-Programmierer-Community ständig etwas Neues präsentieren, um die Benutzerfreundlichkeit zu verbessern. Dies umfasst beispielsweise Hilfstools für das Code-Refactoring, Tools zum Umbenennen von Entitäten und zum Auffinden von Stellen, an denen sie in Programmen verwendet werden.



Das Material, dessen Übersetzung wir heute veröffentlichen, wird einige interessante neue Funktionen von TypeScript diskutieren. Eine vollständige Liste der TypeScript-Innovationen finden Sie hier .

Unveränderliche Objekte und Arrays


Um unveränderliche Arrays zu erstellen, die während der Kompilierung in Form von normalen Variablen und Funktionsparametern verwendet werden, können Sie in TypeScript Hilfstypen Readonlyund verwenden ReadonlyArray. Ihre Verwendung kann jedoch zu einem Gefühl der Heterogenität bei der Typanmerkung führen, insbesondere wenn Arrays []nach Angabe eines Typs mit Zeichen deklariert werden . TypeScript 3.4 bietet eine neue Möglichkeit, Parameter zu kennzeichnen, die schreibgeschützte Arrays sind. Sofort gab es eine neue Möglichkeit, Variablen zu deklarieren, die unveränderlich sein sollten.

Verbesserung der Benutzerfreundlichkeit mit schreibgeschützten Parametern


Wenn Sie die Parameter von Funktionen deklarieren, mit denen Sie als schreibgeschützte Arrays arbeiten müssen, können Sie jetzt das Schlüsselwort verwenden readonly. Im folgenden Beispiel sind die Signaturen der beiden Methoden identisch:

function foo(s: ReadonlyArray<string>) { /* ... */ }
 
function foo(s: readonly string[]) { /* ... */ }

In beiden Fällen führt jeder Versuch, das Array zu ändern (z. B. mithilfe seiner Methode push), zu einem Fehler. Diese Innovation macht einen generischen Hilfstyp überflüssig, wodurch der Code leichter zu lesen ist. Objekttypen können auch als schreibgeschützte Entitäten gekennzeichnet werden, benötigen jedoch weiterhin einen Hilfstyp Readonly.

Verbesserung der Verwendbarkeit unveränderlicher Variablen mit dem Konstrukt as const


Der Typ einer Variablen, die mit einem Schlüsselwort deklariert wurde, constkann nicht geändert werden. Dieses Konzept existiert in JavaScript. Es wird auch in TypeScript übernommen, um eine strengere Arbeit mit Typen zu organisieren. Bei der Arbeit mit Objektdatentypen wie Objekten oder Arrays stellt sich jedoch heraus, dass solche Strukturen nicht wirklich unveränderlich sind. Die Verwendung eines Schlüsselworts constbedeutet, dass eine bestimmte Instanz eines Objekts oder Arrays beim Arbeiten mit einer Konstanten unverändert bleibt. Der Inhalt dieses Objekts oder Arrays kann jedoch leicht geändert werden. Ohne die Regeln für die Arbeit mit const-Entitäten zu verletzen, können Sie dem Array mithilfe der Methode neue Werte hinzufügen und pushdie Werte der Eigenschaften von Objekten ändern.

Verwenden von ReadonlyundReadonlyArraySie können TypeScript mitteilen, dass das System Entitäten so behandeln soll, als wären sie wirklich unveränderlich. Dies bedeutet, dass jedes Mal, wenn im Code versucht wird, eine solche Entität zu ändern, eine Fehlermeldung ausgegeben wird.

interface Person { 
  name: string; 
}
 
const person = { 
  name: 'Will' 
} as Readonly<Person>;
person.name = 'Diana'; // !

In TypeScript 3.4 erschien unter anderem das Konzept der const assertion (Konstante Anweisung), das die Verwendung eines Konstrukts vorsieht as const. Dies ist eine vereinfachte Methode zum Deklarieren von Konstanten, die unveränderliche Objekte und Arrays enthalten. Solche Deklarationen werden erstellt, indem as constam Ende der Deklaration eine Konstante hinzugefügt wird . Diese Methode hat einen zusätzlichen Vorteil: Wenn Sie sie verwenden, müssen Sie den Typ in der Anweisung nicht explizit angeben as const.

const person = { 
        name: 'Will' 
} as const;
 
person.name = 'Diana'; // !
 
//      as const
const array = [1, 2, 3] as const
array.push(4); // !

Hilfstyp Auslassen


In TypeScript gibt es mehrere Hilfstypen, mit denen vorhandene Typen einfach neuen zugeordnet oder ein Typ basierend auf anderen Typen bedingt festgelegt werden kann.

Mit dem Hilfstyp Partialkönnen alle Eigenschaften des Objekts als optional markiert werden. Wie sich herausstellte, habe ich vor der Veröffentlichung von TypeScript 3.5 in meinen Projekten ständig einen interessanten Mechanismus verwendet. Dies ist das gleiche, was die Verwendung des Hilfstyps jetzt ermöglicht Omit. Mit diesem Typ können Sie, wie der Name schon sagt, etwas von anderen Typen ausschließen. OmitAkzeptiert den Typ und die Kombination von Schlüsseln und gibt dann einen neuen Typ zurück, von dem die durch die Schlüssel beschriebenen Eigenschaften ausgeschlossen sind. Vorbei sind die Zeiten, in denen ich Pickes Excludefür die unabhängige Implementierung von Funktionen verwenden mussteOmit.

//     TypeScript 3.5
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
 
interface A { 
    propA?: string; 
    propB?: string; 
    propC?: string; 
}
 
type B = Omit<A, 'propA' | 'propC'>; 
const b: B = { propA: 'hi' }; // ;

Neue JavaScript-Funktionen, die von TypeScript unterstützt werden


Wenn Vorschläge für neue JavaScript-Funktionen die 4. Koordinierungsstufe erreichen, werden sie als Teil der nächsten Version der Sprache betrachtet. Dies bedeutet jedoch nicht, dass solche Funktionen sofort in JavaScript verwendet werden können, da ihre Unterstützung in geeigneten Umgebungen implementiert werden sollte. Die Anwendung sollte Zugriff auf solche Möglichkeiten haben, wo immer ihr normaler Betrieb angenommen wird.

Die Unterstützung für neue JavaScript-Funktionen wird dem TypeScript-Compiler regelmäßig hinzugefügt. In der Regel kann Code, der diese Funktionen implementiert, in JavaScript-Code konvertiert werden, der mit allen Browsern kompatibel ist, die das in angegebene Projekterstellungsziel unterstützen tsconfig.json.

▍ Auf null und undefiniert prüfen


JavaScript-Entwickler sind mit dem Konzept von Wahrheit und Falschheit vertraut. Wenn für die Wahrheit Überprüfung kann 6 Werte identifiziert werden, die immer falsch sind: 0, null, undefined, «», NaN, und, natürlich, false. In den meisten Fällen muss der Entwickler nur herausfinden, ob der Wert wahr oder falsch ist. In einigen Fällen müssen Sie jedoch nur herausfinden, ob der untersuchte Wert ein realer Wert ist nulloder undefined. Zum Beispiel, wenn zwischen Code unterschieden werden muss 0und undefined:

//  ||     ,  index  0
const getValueOrOne = (x?: number) => index || 1
getValueOrOne(0); // 1 <-- 

Dieser Code funktioniert, indem er xauf den Wert gesetzt wird, auf den geschrieben wird index, in allen Fällen, außer wenn der Wert indexgleich ist 0. Damit dieser Code in jeder Situation ordnungsgemäß funktioniert, muss er mithilfe eines komplexeren Testschemas neu geschrieben werden, um den tatsächlichen Werttyp zu ermitteln.

//   ,    
const getValueOrOne = (x?: number) => index !== null && index !== undefined ? : 1
getValueOrOne(0); // 0

Jetzt funktioniert der Code, erfordert jedoch die Verwendung komplexerer Überprüfungen. Der neue Operator zum Überprüfen des Werts auf nullund undefined(es sieht aus wie zwei Fragezeichen - ??) vereinfacht solche Überprüfungen, indem er den Wert im linken Teil zurückgibt, wenn er nicht gleich nullund ist undefined. Andernfalls wird zurückgegeben, was sich auf der rechten Seite befindet.

// !
const getValueOrOne = (x?: number) => index ?? 1
getValueOrOne(0); // 0
getValueOrOne(2); // 2
getValueOrOne(); // 1

▍ Optionale Sequenzen


Eine weitere neue JavaScript-Funktion in TypeScript 3.7 ist der Operator zum Organisieren optionaler Sequenzen ( ?.). Ich habe einen solchen Operator zum ersten Mal in der Programmiersprache Groovy getroffen. Seitdem wollte ich, dass es auch in JavaScript angezeigt wird. Mit diesem Operator können Sie den Zugriff auf die eingebetteten Eigenschaften von Objekten organisieren, ohne deren Existenz ständig überprüfen zu müssen. Wenn dieser Operator beim Zugriff auf eine Eigenschaft auf einen Wert stößt undefined, gibt er diesen Wert einfach zurück, ohne einen Fehler auszulösen TypeError.

//    
const value = foo && foo.bar && foo.bar.baz;
 
//    
const value = foo?.bar?.baz;

Der optionale Sequenzoperator kombiniert mit dem Operator zum Überprüfen der Werte nullund undefinedbietet dem Entwickler noch mehr Möglichkeiten, um beispielsweise entweder den Wert einer verschachtelten Eigenschaft des Objekts oder, falls eine solche Eigenschaft nicht vorhanden ist, einen Standardwert in die Variable zu schreiben. So sieht es aus:

const value = foo?.bar?.baz ?? 'default value';

▍ Private Klassenfelder


TypeScript hat seit dem Aufkommen dieser Sprache ein eigenes Konzept von privaten Klassenfeldern, die mit einem Zugriffsmodifikator deklariert wurden private. Dieses Konzept erschien in TypeScript, noch bevor Klassen im ECMAScript-Standard beschrieben wurden. In TypeScript bezieht sich dieses Konzept jedoch auf die Mechanismen, die während der Codekompilierung funktionieren. Der Compiler gibt einen Fehler aus, wenn auf das private Feld der Klasse nicht über die eigenen Methoden der Klasse zugegriffen wird. In JavaScript besteht jetzt die Möglichkeit, private Eigenschaften und Methoden einer Klasse zu deklarieren. Diese Funktion unterscheidet sich jedoch sowohl semantisch als auch syntaktisch von der in TypeScript noch vorhandenen.

Private Felder in JavaScript werden nicht mit einem Zugriffsmodifikator deklariert private. Stattdessen werden sie deklariert, indem am Anfang ihres Namens ein Symbol eingefügt wird #.

class Fan 
    #on = false
    private name = 'fan';
 
    turnOn() { 
        this.#on = true
    }
   isTurnedOn() { 
        return this.#on; 
    }
}
 
const fan = new Fan(); 
fan.isTurnedOn(); // false  
fan.turnOn(); 
fan.isTurnedOn(); // true
 
fan.on; //  
fan.#on; // 
fan.name; //   ,    JS

JavaScript unterstützt jetzt private Felder. Der Vorschlag für private Methoden befindet sich in der dritten Genehmigungsphase. Derzeit können der Modifikator privateund das Zeichen #im Feldnamen nicht zusammen verwendet werden. Beide Ansätze können sich während der Entwicklung als nützlich erweisen. Welche Sie wählen müssen, hängt vom Programmierer ab. Hier ist ein Podcast, in dem die neue Syntax zum Deklarieren privater Felder erläutert wird.

▍Verwenden Sie das Schlüsselwort await auf der obersten Codeebene


Asynchrone Programmiermechanismen erweitern die Funktionen von JavaScript und TypeScript erheblich. In diesem Bereich tauchten zunächst Versprechen auf - ein Design async/await, mit dem Sie saubereren asynchronen Code schreiben können.

Einer der Fälle, in denen Versprechen verwendet werden und nicht, async/awaitist ein asynchroner Methodenaufruf außerhalb der asynchronen Funktion. Zum Beispiel auf der obersten Ebene des Modul- oder Anwendungscodes. Um dieses Problem zu umgehen, können Sie vorschlagen, einen asynchronen, sofort aufgerufenen Funktionsausdruck (IIFE, sofort aufgerufener Funktionsausdruck) zu erstellen und asynchronen Code in einem solchen Ausdruck auszuführen.

(async () => { 
    const response = await fetch('https://api.github.com/users/sitepen'); 
    const data = await response.json(); 
    console.log(`Check out the blog at ${data.blog}`); 
})();

TypeScript unterstützt jetzt die Fähigkeit von JavaScript, Schlüsselwörter awaitauf der obersten Codeebene zu verwenden. Dies bedeutet, dass await außerhalb der mit dem Schlüsselwort deklarierten Funktionen verwendet werden kann async. Dies ist sehr gut beim Schreiben von kompaktem und klarem Code. Die Ausdrücke awaitauf der obersten Ebene des Codes werden zwar dafür kritisiert, dass sie das Laden von Modulen verlangsamen und eine Situation schaffen können, in der ein bestimmtes Modul das Laden der gesamten Anwendung verlangsamen kann, da das System auf den Abschluss des asynchronen Vorgangs warten und dann den gesamten Code des Moduls ausführen muss.

const response = await fetch('https://api.github.com/users/sitepen'); 
const data = await response.json();
 
export default { ...data };

Erweiterte TypeScript-Experimentierumgebung


Dies kann nicht als neue TypeScript-Funktion bezeichnet werden. Da es sich jedoch um TypeScript als Tool handelt, kann TypeScript Playground als effektives Tool zum schnellen Überprüfen von TypeScript-Konstrukten und zum Anzeigen des JavaScript-Codes bezeichnet werden, in den diese Konstrukte umgewandelt werden. Die meisten Beispiele hier wurden speziell in TypeScript Playground getestet. Diese Umgebung unterstützt jetzt die Möglichkeit, eine bestimmte Version von TypeScript auszuwählen (einschließlich der Unterstützung von Beta-Versionen). Es enthält mehrere Beispiele, die Anfängern den Einstieg in TypeScript erleichtern.

Zusammenfassung


TypeScript ist ein Tool, mit dem Sie besseren und aussagekräftigeren JavaScript-Code schreiben können. Mit den TypeScript-Hilfstools können komplexe Aufgaben wie das Umgestalten und Umbenennen von Entitäten, die in gewöhnlichem JavaScript viel komplizierter sind, auf einfache Weise gelöst werden. TypeScript führt ständig neue Mechanismen wie Omitund ein as const. In der Sprache kann man eine kontinuierliche Verbesserung der Unterstützung komplexer Typen beobachten. TypeScript implementiert schnell die neuesten JavaScript-Funktionen. Aus diesem Grund entscheiden sich viele Menschen für TypeScript und nehmen es als Werkzeug, Sprache und Ökosystem wahr.

Liebe Leser! Welche neuen TypeScript-Funktionen finden Sie am interessantesten?


All Articles