Features und Nutzung
Features
TypeScript lässt sich als Obermenge („strict superset“) zu ‚ECMAScript 2015‘ definieren, was wiederum eine Obermenge zu ‚ECMAScript 5‘, der Vorgängerversion, ist. So bietet es viele Features über das Repertoire von JavaScript hinaus, wobei manche in ‚ECMAScript 2015‘ ebenfalls übernommene Konstrukte sind, die für ältere JavaScript-Versionen zur Verfügung gestellt werden („Backport“).
Erweiterungen zu ‚ECMAScript 2015‘:
Methodensignatur Prüfung zu Kompilierzeit
Typinferenz
Type Erasure
Interfaces
Aufzählungstypen
Generische Programmierung
Namensräume
Tupel
Async/Await
Backport von ‚ECMAScript 2015‘:
Klassen
Module
Arrow-Syntax für anonyme Funktionen
Optionale Parameter und Standardparameter
Typisierung
Der Namensgebende Hauptpunkt ist die Typisierung, welche beispielsweise durch die Methodensignaturen ermöglicht wird. Diese wird beim transpilieren in JavaScript geprüft, wodurch Typsicherheit gewährleistet werden kann.
Nutzung und Kompatibilität
Typescript wird, der Nutzung von JavaScript folgend, vor allem in Browsern für Clientseitige Funktionalitäten von Webseiten genutzt. Jedoch findet es auch sonst immer mehr Anwendung, wenn JavaScript eine Rolle spielt, wie beispielsweiße bei der plattformunabhängigen Laufzeitumgebung `Node.js <NodeJS_>`__, welche JavaScript-Code unter Anderem auch serverseitig einsetzbar macht.
Transpiler
Während korrekter JavaScript-Code, aufgrund der Obermengen-Beziehung, auch immer valider TypeScript-Code ist, müssen Programme umgekehrt zunächst in JavaScript übersetzt werden. Dies wird vom Typescript-Transpiler, oder verschiedenen ähnlichen Tools, übernommen. Standardmäßig generiert der Typescript-Transpiler Code in der Version ‚ECMAScript 5‘, jedoch kann optional auch auf ‚ECMAScript 3‘ oder ‚ECMAScript 2015‘ umgestellt werden.
Während Typescript zunächst Ahead Of Time in JavaScript-Code transpiliert wird, wird dieser JavaScript-Code dann meist Just In Time im Browser kompiliert.
Bemerkung
Der Begriff Transpiler weist darauf hin, dass es sich um eine Umwandlung zwischen zwei Programmiersprachen, auf ungefähr dem selben Abstraktionslevel, handelt. Im Gegensatz dazu übersetzen Compiler den Code in ein niedrigeres Abstraktionslevel.
Typ-Definitions-Dateien
Da Typescript die direkte Zusammenarbeit von Typescript-Code und JavaScript-Code ermöglicht, kann man auch externe Bibliotheken nutzen. Diese lassen sich genau so direkt nutzen, wie wenn die Entwicklung in JavaScript stattfinden würde.
Um JS-Bibliotheken in Typescript jedoch mit allen Vorteilen der Typisierung nutzen zu können, ohne diese neu implementieren zu müssen, gibt es die Möglichkeit Definitions-Dateien zu erstellen, welche die nötigen Typdefinitionen für die Nutzung der Bibliothek vorgeben. Diese Definitionen sind für bekannte Bibliotheken, wie `jQuery <jQuery_>`__ oder `Node.js <NodeJS_>`__, sowie auch für viele kleinere Projekte, meist von Dritten bereits erstellt, und zur Verfügung gestellt.
DefinitelyTyped
Das GitHub-Repository DefinitelyTyped_ ist eine klare Empfehlung, um herauszufinden ob für ein bestimmtes Projekt bereits diese Typescript-Definitionen vorhanden sind, um diese in eigene Projekt einbinden zu können. `jQuery-Definitions-Datei <jQuery-Def_>`__ und `Node.js-Definitions-Datei <NodeJS-Def_>`__
So sieht beispielsweiße die erste Definition der jQuery-Funktion on() aus:
7613 /**
7614 * Attach an event handler function for one or more events to the selected elements.
7615 * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin".
7616 * @param selector A selector string to filter the descendants of the selected elements that trigger the event. If the
7617 * selector is null or omitted, the event is always triggered when it reaches the selected element.
7618 * @param data Data to be passed to the handler in event.data when an event is triggered.
7619 * @param handler A function to execute when the event is triggered.
7620 * @see \`{@link https://api.jquery.com/on/ }\`
7621 * @since 1.7
7622 */
7623 on<TType extends string,
7624 TData>(
7625 events: TType,
7626 selector: JQuery.Selector,
7627 data: TData,
7628 handler: JQuery.TypeEventHandler<TElement, TData, any, any, TType>
7629 ): this;
Es müssen die verschiedensten Möglichkeiten mit verschiedenen Parametertypen beachtet und extra definiert werden.
Zum Beispiel kann für den Parameter selector auch null und undefined übergeben werden:
7630 /**
7631 * Attach an event handler function for one or more events to the selected elements.
7632 * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin".
7633 * @param selector A selector string to filter the descendants of the selected elements that trigger the event. If the
7634 * selector is null or omitted, the event is always triggered when it reaches the selected element.
7635 * @param data Data to be passed to the handler in event.data when an event is triggered.
7636 * @param handler A function to execute when the event is triggered.
7637 * @see \`{@link https://api.jquery.com/on/ }\`
7638 * @since 1.7
7639 */
7640 on<TType extends string,
7641 TData>(
7642 events: TType,
7643 selector: null | undefined,
7644 data: TData,
7645 handler: JQuery.TypeEventHandler<TElement, TData, TElement, TElement, TType>
7646 ): this;
Wenn beispielsweiße die Verwendung eines Typs veraltet ist, kann sich natürlich auch die zugehörige Dokumentation unterscheiden:
7647 /**
7648 * Attach an event handler function for one or more events to the selected elements.
7649 * @param events One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin".
7650 * @param selector A selector string to filter the descendants of the selected elements that trigger the event. If the
7651 * selector is null or omitted, the event is always triggered when it reaches the selected element.
7652 * @param data Data to be passed to the handler in event.data when an event is triggered.
7653 * @param handler A function to execute when the event is triggered.
7654 * @see \`{@link https://api.jquery.com/on/ }\`
7655 * @since 1.7
7656 * @deprecated Deprecated. Use \`{@link JQuery.Event }\` in place of \`{@link JQueryEventObject }\`.
7657 */
7658 on(events: string,
7659 selector: JQuery.Selector | null | undefined,
7660 data: any,
7661 handler: ((event: JQueryEventObject) => void)): this;
[TS] [jQuery] [NodeJS] [DefinitelyTyped] [jQuery-Def] [NodeJS-Def]