TypeScript

Aus besserwiki.de
TypScript
Typescript logo 2020.svg
ParadigmaMulti-Paradigma: funktional, generisch, imperativ, objektorientiert
Entworfen vonMicrosoft
EntwicklerMicrosoft
Erstmals erschienen am.1. Oktober 2012; vor 10 Jahren
TypisierungsdisziplinEnte, schrittweise, strukturell
Lizenz .Apache License 2.0
Dateinamen-Erweiterungen.ts, .tsx
Websitewww.typescriptlang.org
Beeinflusst von
C#, Java, JavaScript, ActionScript
Beeinflusst
AtScript, AssemblyScript

TypeScript ist eine Programmiersprache, die von Microsoft entwickelt und gepflegt wird. Sie ist eine strenge syntaktische Obermenge von JavaScript und fügt der Sprache eine optionale statische Typisierung hinzu. Sie ist für die Entwicklung großer Anwendungen konzipiert und lässt sich in JavaScript übertragen. Da es sich um eine Obermenge von JavaScript handelt, sind bestehende JavaScript-Programme auch gültige TypeScript-Programme.

TypeScript kann verwendet werden, um JavaScript-Anwendungen sowohl für die clientseitige als auch für die serverseitige Ausführung zu entwickeln (wie bei Node.js oder Deno). Für die Transpilierung stehen mehrere Optionen zur Verfügung. Der standardmäßige TypeScript-Compiler kann verwendet werden, oder der Babel-Compiler kann aufgerufen werden, um TypeScript in JavaScript zu konvertieren.

TypeScript unterstützt Definitionsdateien, die Typinformationen vorhandener JavaScript-Bibliotheken enthalten können, ähnlich wie C++-Header-Dateien die Struktur vorhandener Objektdateien beschreiben können. Dadurch können andere Programme die in den Dateien definierten Werte so verwenden, als wären sie statisch typisierte TypeScript-Entitäten. Es gibt Header-Dateien von Drittanbietern für beliebte Bibliotheken wie jQuery, MongoDB und D3.js. TypeScript-Header für die Node.js-Basismodule sind ebenfalls verfügbar und ermöglichen die Entwicklung von Node.js-Programmen innerhalb von TypeScript.

Der TypeScript-Compiler ist selbst in TypeScript geschrieben und zu JavaScript kompiliert. Er ist unter der Apache License 2.0 lizenziert. TypeScript ist neben C# und anderen Microsoft-Sprachen als Programmiersprache erster Klasse in Microsoft Visual Studio 2013 Update 2 und höher enthalten. Eine offizielle Erweiterung ermöglicht es auch Visual Studio 2012, TypeScript zu unterstützen. Anders Hejlsberg, leitender Architekt von C# und Schöpfer von Delphi und Turbo Pascal, hat an der Entwicklung von TypeScript mitgearbeitet.

TypeScript ist eine von Microsoft entwickelte Programmiersprache, die auf den Vorschlägen zum ECMAScript-6-Standard basiert. Sprachkonstrukte von TypeScript, wie Klassen, Vererbung, Module und anonyme Funktionen, wurden auch in ECMAScript 6 übernommen.

TypeScript unterstützt mit Modulen das Kapseln von Klassen, Interfaces, Funktionen und Variablen in eigene Namensräume. Dabei wird zwischen internen und externen Modulen unterschieden. Interne Module lehnen sich an die Modul-Spezifikation aus ECMAScript 6 an, wohingegen externe Module eine JavaScript-Bibliothek (AMD oder CommonJS) nutzen.

TypeScript kann mit Hilfe von Plug-ins in verschiedene Build-Management-Tools integriert werden, darunter Grunt (grunt-ts), Apache Maven (TypeScript Maven Plugin) und Gradle (TypeScript Gradle Plugin).

Geschichte

Die erste öffentlich verfügbare Version von TypeScript wurde 2012 nach zwei Jahren Entwicklung von Microsoft in der Version 0.8 veröffentlicht. Kurz nach Ankündigung der Sprache wurde diese von Miguel de Icaza gelobt. Jedoch bemängelte er, dass es keine weiteren Entwicklungsumgebungen abseits von Microsoft Visual Studio gab, das 2013 nicht für Linux und macOS zur Verfügung stand. Seit 2013 gab es Plugin-Support für Eclipse, der von Palantir Technologies bereitgestellt wurde. Mittlerweile unterstützen eine Vielzahl von Texteditoren und Entwicklungsumgebungen TypeScript. Darunter befinden sich unter anderem Emacs, vim, Sublime Text, WebStorm, Atom und Microsofts eigener Editor Visual Studio Code.

TypeScript 0.9 wurde 2013 veröffentlicht und brachte Unterstützung für Generische Typen.

TypeScript 1.0 wurde 2014 auf Microsofts hauseigener Entwicklerkonferenz Build vorgestellt. Auch erhielt Visual Studio Unterstützung für TypeScript.

Im Juli 2014 kündigten die Entwickler von TypeScript einen neuen Compiler an, der fünfmal schneller sein sollte als der alte. Gleichzeitig wurde der bisherige Quellcode von TypeScript von CodePlex zu GitHub migriert.

Am 22. September 2016 wurde die Version 2.0 veröffentlicht, die diverse neue Funktionen einführte. Unter anderem wurde eine optionale Funktion eingeführt, um zu verhindern, dass Variablen standardmäßig mit null initialisiert sind. Dies soll zu weniger Nullpointer Exceptions führen.

Am 30. Juli 2018 wurde die Version 3.0 veröffentlicht. Besonders hervorzuheben ist der neue primitive Typ unknown. Zusammen mit void (dem Einheitstyp) und never (dem leeren Typ) vervollständigt er die Ränder der Typenhierarchie: unknown ist ein Universaltyp; einer Variable davon kann jedes Objekt zugewiesen werden, und entsprechend kann man von einem unknown-Wert nichts erwarten. TypeScript verlangt dann eine Assertion oder Checks. Im Unterschied dazu ist any zwar auch ein Universaltyp, jedoch erlaubt TypeScript die Verwendung der Werte direkt, obwohl eigentlich keine Information darüber vorliegt. Damit ist unknown nichts anderes als das typsichere Äquivalent zu any.

TypeScript 4.0 wurde am 20. August 2020 veröffentlicht. Während 4.0 keine bahnbrechenden Änderungen einführte, fügte es Sprachfunktionen wie Custom JSX Factories und Variadic Tuple Types hinzu.

Entwurf

TypeScript entstand aus den Unzulänglichkeiten von JavaScript für die Entwicklung umfangreicher Anwendungen sowohl bei Microsoft als auch bei deren externen Kunden. Herausforderungen im Umgang mit komplexem JavaScript-Code führten zur Nachfrage nach benutzerdefinierten Werkzeugen, um die Entwicklung von Komponenten in dieser Sprache zu erleichtern.

TypeScript-Entwickler suchten nach einer Lösung, die die Kompatibilität mit dem Standard und dessen plattformübergreifender Unterstützung nicht beeinträchtigt. Da der aktuelle ECMAScript-Standardvorschlag zukünftige Unterstützung für klassenbasierte Programmierung versprach, wurde TypeScript auf diesem Vorschlag aufgebaut. Dies führte zu einem JavaScript-Compiler mit einer Reihe von syntaktischen Spracherweiterungen, einer auf dem Vorschlag basierenden Obermenge, die die Erweiterungen in reguläres JavaScript umwandelt. In diesem Sinne war TypeScript eine Vorschau auf das, was von ECMAScript 2015 zu erwarten ist. Ein einzigartiger Aspekt, der nicht im Vorschlag enthalten ist, aber TypeScript hinzugefügt wurde, ist die optionale statische Typisierung, die eine statische Sprachanalyse ermöglicht, was die Unterstützung von Werkzeugen und IDEs erleichtert.

ECMAScript 2015-Unterstützung

TypeScript bietet Unterstützung für Funktionen wie Klassen, Module und eine Pfeilfunktionssyntax, wie sie im ECMAScript 2015-Standard definiert sind.

Funktionen

TypeScript ist eine Spracherweiterung, die Funktionen zu ECMAScript 6 hinzufügt. Zu den zusätzlichen Funktionen gehören:

  • Typ-Annotationen und Typüberprüfung zur Kompilierzeit
  • Inferenz von Typen
  • Typ-Löschung
  • Schnittstellen
  • Aufgezählte Typen
  • Generische Typen
  • Namensräume
  • Tupel
  • Async/Wait

Die folgenden Funktionen wurden aus ECMAScript 2015 zurückportiert:

  • Klassen
  • Module
  • Abgekürzte "Pfeil"-Syntax für anonyme Funktionen
  • Optionale Parameter und Standardparameter

Syntaktisch ist TypeScript JScript .NET sehr ähnlich, einer anderen Microsoft-Implementierung des ECMA-262-Sprachstandards, die Unterstützung für statische Typisierung und klassische objektorientierte Sprachmerkmale wie Klassen, Vererbung, Schnittstellen und Namespaces hinzugefügt hat.

Kompatibilität mit JavaScript

TypeScript ist eine strenge Obermenge von ECMAScript 2015, das wiederum eine Obermenge von ECMAScript 5 ist, das gemeinhin als JavaScript bezeichnet wird. Daher ist ein JavaScript-Programm auch ein gültiges TypeScript-Programm, und ein TypeScript-Programm kann nahtlos JavaScript verwenden. Standardmäßig zielt der Compiler auf ECMAScript 5, den derzeit vorherrschenden Standard, ist aber auch in der Lage, Konstrukte zu erzeugen, die in ECMAScript 3 oder 2015 verwendet werden.

Mit TypeScript ist es möglich, vorhandenen JavaScript-Code zu verwenden, beliebte JavaScript-Bibliotheken einzubinden und von TypeScript generierten Code aus anderem JavaScript aufzurufen. Typendeklarationen für diese Bibliotheken werden mit dem Quellcode bereitgestellt.

Typ-Annotationen

TypeScript bietet statische Typisierung durch Typ-Annotationen, um eine Typüberprüfung zur Kompilierungszeit zu ermöglichen. Dies ist optional und kann ignoriert werden, um die reguläre dynamische Typisierung von JavaScript zu verwenden.

function add(left: Zahl, right: Zahl): Zahl {
	return left + right;
} <span title="Aus: Englische Wikipedia, Abschnitt &quot;Type annotations&quot;" class="plainlinks">[https://en.wikipedia.org/wiki/TypeScript#Type_annotations <span style="color:#dddddd">ⓘ</span>]</span>

Die Annotationen für die primitiven Typen sind number, boolean und string. Typescript unterstützt auch Datentypen mit folgenden Annotationen: Array, Enums, void.

Weitere Datentypen sind: Tuple, Union, never und any. Ein Array mit vordefinierten Datentypen bei jedem Index ist der Typ Tuple. Eine Variable, die mehr als einen Datentyp enthält, ist vom Typ Union. Wenn Sie sich sicher sind, dass etwas niemals eintreten wird, verwenden Sie den Typ never. Schwach- oder dynamisch typisierte Strukturen sind von beliebigem Typ.

Typ-Annotationen können in eine separate Deklarationsdatei exportiert werden, um Typinformationen für TypeScript-Skripte verfügbar zu machen, die bereits in JavaScript kompilierte Typen verwenden. Annotationen können für eine bestehende JavaScript-Bibliothek deklariert werden, wie es für Node.js und jQuery gemacht wurde.

Der TypeScript-Compiler macht von der Typinferenz Gebrauch, um Typen abzuleiten, wenn keine Typen angegeben sind. Zum Beispiel würde die add-Methode im obigen Code eine Zahl zurückgeben, auch wenn kein Rückgabetyp angegeben wurde. Dies beruht darauf, dass die statischen Typen von left und right Zahlen sind und dass der Compiler weiß, dass das Ergebnis der Addition zweier Zahlen immer eine Zahl ist. Die explizite Deklaration des Rückgabetyps ermöglicht es dem Compiler jedoch, die Korrektheit zu überprüfen.

Wenn aufgrund fehlender Deklarationen kein Typ abgeleitet werden kann, wird standardmäßig der dynamische Typ any verwendet. Ein Wert vom Typ any unterstützt die gleichen Operationen wie ein Wert in JavaScript, und für Operationen mit any-Werten wird nur eine minimale statische Typüberprüfung durchgeführt.

Deklarationsdateien

Wenn ein TypeScript-Skript kompiliert wird, besteht die Möglichkeit, eine Deklarationsdatei (mit der Erweiterung .d.ts) zu erzeugen, die als Schnittstelle zu den Komponenten im kompilierten JavaScript dient. Dabei entfernt der Compiler alle Funktions- und Methodenkörper und behält nur die Signaturen der exportierten Typen bei. Die resultierende Deklarationsdatei kann dann verwendet werden, um die exportierten virtuellen TypeScript-Typen einer JavaScript-Bibliothek oder eines Moduls zu beschreiben, wenn ein Drittentwickler diese aus TypeScript konsumiert.

Das Konzept der Deklarationsdateien ist analog zu dem Konzept der Header-Datei in C/C++.

deklarieren Namespace Arithmetik {
    add(links: Zahl, rechts: Zahl): Zahl;
    subtract(links: Zahl, rechts: Zahl): Zahl;
    multiply(links: Zahl, rechts: Zahl): Zahl;
    divide(links: Zahl, rechts: Zahl): Zahl;
} <span title="Aus: Englische Wikipedia, Abschnitt &quot;Declaration files&quot;" class="plainlinks">[https://en.wikipedia.org/wiki/TypeScript#Declaration_files <span style="color:#dddddd">ⓘ</span>]</span>

Typendeklarationsdateien können für bestehende JavaScript-Bibliotheken von Hand geschrieben werden, wie es für jQuery und Node.js geschehen ist.

Große Sammlungen von Deklarationsdateien für beliebte JavaScript-Bibliotheken werden auf GitHub in DefinitelyTyped gehostet.

Klassen

TypeScript unterstützt ECMAScript 2015-Klassen, die die optionale Unterstützung von Typ-Annotationen integrieren.

class Person {
    private name: string;
    private Alter: Zahl;
    private Gehalt: Zahl; <span title="Aus: Englische Wikipedia, Abschnitt &quot;Classes&quot;" class="plainlinks">[https://en.wikipedia.org/wiki/TypeScript#Classes <span style="color:#dddddd">ⓘ</span>]</span>

    constructor(name: string, alter: zahl, gehalt: zahl) {
        this.name = name;
        this.age = Alter;
        this.gehalt = gehalt;
    } <span title="Aus: Englische Wikipedia, Abschnitt &quot;Classes&quot;" class="plainlinks">[https://en.wikipedia.org/wiki/TypeScript#Classes <span style="color:#dddddd">ⓘ</span>]</span>

    toString(): string {
        return `${this.name} (${this.age}) (${this.salary})`; // Ab Version 1.4
    }
}

</syntaxhighlight>

Generische Programmierung

TypeScript unterstützt die generische Programmierung. Im Folgenden ein Beispiel für die Identitätsfunktion.

function id<T>(x: T): T {
    return x;
} <span title="Aus: Englische Wikipedia, Abschnitt &quot;Generics&quot;" class="plainlinks">[https://en.wikipedia.org/wiki/TypeScript#Generics <span style="color:#dddddd">ⓘ</span>]</span>

Module und Namespaces

In TypeScript wird zwischen Modulen und Namespaces unterschieden. Beide Funktionen in TypeScript unterstützen die Kapselung von Klassen, Schnittstellen, Funktionen und Variablen in Containern. Namespaces (ehemals interne Module) nutzen den unmittelbar aufgerufenen Funktionsausdruck von JavaScript, um Code zu kapseln, während Module (ehemals externe Module) JavaScript-Bibliotheksmuster nutzen (AMD oder CommonJS), um dies zu tun.

Entwicklungswerkzeuge

Compiler

Der TypeScript-Compiler mit dem Namen tsc ist in TypeScript geschrieben. Dadurch kann er in reguläres JavaScript kompiliert und dann in jeder JavaScript-Engine (z. B. einem Browser) ausgeführt werden. Das Compiler-Paket wird zusammen mit einem Skript-Host geliefert, der den Compiler ausführen kann. Er ist auch als Node.js-Paket verfügbar, das Node.js als Host verwendet.

Die aktuelle Version des Compilers unterstützt standardmäßig ECMAScript 5. Es besteht die Möglichkeit, ECMAScript 2015 zu verwenden, um die Sprachfunktionen zu nutzen, die nur in dieser Version verfügbar sind (z. B. Generatoren). Klassen sind, obwohl sie Teil des ECMAScript 2015-Standards sind, in beiden Modi verfügbar.

IDE- und Editor-Unterstützung

  • Microsoft bietet ein Plug-in für Visual Studio 2012 und WebMatrix, vollständige integrierte Unterstützung in Visual Studio 2013 und Visual Studio 2015 sowie grundlegende Texteditor-Unterstützung für Emacs und Vim.
  • Visual Studio Code ist ein (größtenteils) quelloffener, plattformübergreifender Quellcode-Editor, der von Microsoft auf Basis von Electron entwickelt wurde. Er unterstützt neben mehreren anderen Sprachen auch TypeScript und bietet Funktionen wie Debugging und intelligente Code-Vervollständigung.
  • alm.tools ist eine Open-Source-Cloud-IDE für TypeScript, die auf TypeScript, ReactJS und TypeStyle basiert.
  • JetBrains unterstützt TypeScript mit Code-Vervollständigung, Refactoring und Debugging in seinen IDEs, die auf der IntelliJ-Plattform aufbauen, wie PhpStorm 6, WebStorm 6 und IntelliJ IDEA, sowie in seinem Visual Studio Add-in und der Erweiterung ReSharper 8.1.
  • Atom verfügt über ein TypeScript-Plugin mit Unterstützung für Code-Vervollständigung, Navigation, Formatierung und schnelle Kompilierung.
  • Die Online-IDE Cloud9 und Codenvy unterstützen TypeScript.
  • Ein Plugin ist für die NetBeans IDE verfügbar.
  • Ein Plugin ist für die Eclipse IDE (Version Kepler) verfügbar.
  • TypEcs ist für die Eclipse IDE verfügbar.
  • Die Cross Platform Cloud IDE Codeanywhere unterstützt TypeScript.
  • Webclipse Ein Eclipse-Plugin für die Entwicklung von TypeScript und Angular 2.
  • Angular IDE Eine eigenständige IDE, die über npm verfügbar ist, um TypeScript- und Angular 2-Anwendungen zu entwickeln, mit integrierter Terminal-Unterstützung.
  • Tide - TypeScript Interaktive Entwicklungsumgebung für Emacs.

Integration mit Build-Automatisierungstools

Mithilfe von Plug-ins kann TypeScript in Build-Automatisierungstools integriert werden, darunter Grunt (grunt-ts), Apache Maven (TypeScript Maven Plugin), Gulp (gulp-typescript) und Gradle (TypeScript Gradle Plugin).

Linting-Werkzeuge

TSLint prüft TypeScript-Code auf Konformität mit einer Reihe von Standards und Richtlinien. ESLint, ein Standard-JavaScript-Linter, bietet über Community-Plugins auch einige Unterstützung für TypeScript. Da ESLint jedoch nicht in der Lage war, die Sprachdienste von TypeScript zu nutzen, waren bestimmte Formen des semantischen Lintings und der programmweiten Analyse nicht möglich. Anfang 2019 kündigte das TSLint-Team die Abschaffung des Linters zugunsten von typescript-eslint an, einer gemeinsamen Anstrengung der TSLint-, ESLint- und TypeScript-Teams, um das Linting unter dem Dach von ESLint zu konsolidieren und so die Leistung, die Einheitlichkeit der Community und die Zugänglichkeit für Entwickler zu verbessern.

Versionsgeschichte

Versionsnummer Veröffentlichungsdatum Änderungen
0.8 1. Oktober 2012 Erste Veröffentlichung
0.9 18. Juni 2013 Generische Ausdrücke, Überladen von konstanten Parametern, Enum
1.1 6. Oktober 2014 Performanceverbesserungen
1.3 12. November 2014 protected Zugriffsmodifikator, Tupel-Typen
1.4 20. Januar 2015 Union-Typen, let und const Deklarationen, Template Strings, Type Guards, Type Aliases
1.5 20. Juli 2015 ES6-Module, namespace Keyword, for..ofSupport, Decorator
1.6 16. September 2015 JSX-Unterstützung, Intersection Typen, lokale Typdeklarationen, abstrakte Klassen und Methoden, benutzerdefinierte Guard-Funktionen
1.7 30. November 2015 Unterstützung für async und await
1.8 22. Februar 2016 Constraints Generics, Kontrollfluss-Fehleranalyse, Stringliteral-Typen, allowJs
2.0 22. September 2016 null- und undefined-verhindernde Typen, kontrollflussbasierte Typanalyse, Discriminated Uniontypen, never Typ, readonly Keyword, this
2.1 8. November 2016 keyof und Lookup Typen, gemappte Typen, REST- und Spread-Eigenschaften für Objekte
2.2 22. Februar 2017 Mix-in Klassen, object Typ
2.3 27. April 2017 async Iteration, generische Standardparameter, strict-Option
2.4 27. Juni 2017 dynamische import Ausdrücke, String Enums, verbesserte Vererbung für generische Datentypen, strikte Kontravarianz für Callback-Parameter
2.5 31. August 2017 optionale Catch-Clause-Variablen für Exceptions
2.6 31. Oktober 2017 strikte Funktionstypen
2.7 31. Januar 2018 const-benannte Eigenschaften, Tupel mit fester Länge
2.8 27. März 2018 Conditional-Typen, Verbesserung von keyof in Kombination mit Intersection-Typen
2.9 31. Mai 2018 Unterstützung von number und symbol benannten Eigenschaften mit keyof und endlichen Abbildungen. import(...)-Typen.
3.0 30. Juli 2018 Tupel als REST-Parameter, Spread-Ausdrücke für Tupel, generische REST-Parameter, Optionale Elemente in Tupel, unknown als Universaltyp (siehe auch Typentheorie), defaultProps in JSX
3.1 27. September 2018 Gemappte Tuple und Array-Typen
3.2 30. November 2018 Strengere Kontrolle von bind, call und apply
3.3 31. Januar 2019 Lockere Regeln für Methoden der Verbindungsarten, inkrementelle Builds für Verbundprojekte
3.4 29. März 2019 Verbesserungen zu inkrementellen Builds, Composite Projects, Inference, Read-Only Arrays, Type-Checking für globale Variablen und diverse andere
3.5 29. Mai 2019 Omit als neuer integrierter Typ
3.6 28. August 2019 striktere Iterator- und Generatorfunktionen, Unterstützung für Unicode bei Bezeichnern
3.7 5. November 2019 Optionale Verkettung, Nullish Coalescing Operator, Assertion Functions, verbesserte Unterstützung für Methoden, die never zurückliefern, und viele weitere.
3.8 20. Februar 2020 Type-Only Imports und Exports, private Felder, Top-Level await und viele weitere Änderungen.
3.9 12. Mai 2020 Geschwindigkeitsverbesserungen beim Build, @‌ts-expect-error Kommentar, Verbesserungen für Editoren und weitere Änderungen.
4.0 20. August 2020 Variadische Tupel, Namen für Elemente in einem Tupel, bessere JSX-Unterstützung
4.1 19. November 2020 Verkettung von String-Typen
4.2 23. Februar 2021

bessere Erhaltung von Typaliasen
Führende/mittlere Restelemente in Tupeltypen
Strengere Überprüfungen für den in-Operator
abstrakte Konstruktionssignaturen
Verbesserte Überprüfungen von nicht aufgerufenen Funktionen in logischen Ausdrücken
Destrukturierte Variablen können explizit als unbenutzt markiert werden
Lockere Regeln zwischen optionalen Eigenschaften und String-Index-Signaturen

4.3 26. Mai 2021

Separate Parametertypen in Eigenschaften gettern und settern
Kontextbezogene Eingrenzung für Generics

4.4 26. August 2021

Kontrollflussanalyse von Aliased Bedingungen und Discriminants
Indexsignaturen von Symbolen und Schablonenstringmustern
Voreinstellung auf den unknown-Typ in Catch-Variablen
"static"-Blöcke in Klassen
Performance-Verbesserungen

4.5 17. November 2021

Der "await"-Typ und "promise"-Verbesserungen
Deaktivierung der Import Prüfung
type-Deklarationen für Importnamen
Prüfungen auf private Felder in Objekten
import-Prüfungen

4.6 28. Februar 2022

Erlaubter Code in Konstruktoren vor super()
Verbesserte Prüfungen der Rekursionstiefe

4.7 24. Mai 2022

Kontrolle über die Modul-Erkennung
Kontrollflussanalyse für den Zugriff auf eingeklammerte Elemente
Verbesserte Funktionsinferenz in Objekten und Methoden
Instanziierungsausdrücke
erweiterte Beschränkungen auf infer-type-Variablen
Optionale Varianz-Annotationen für type-Parameter