Oktober 20, 2021

Buzznice.com

Komplette Nachrichtenwelt

Programmiersprache: TypeScript 4.1 erweitert Mapping- und String-Literal-Typen

3 min read

Microsoft hat die erste Beta-Version von TypeScript 4.1 veröffentlicht. Die Version bietet mehr Flexibilität für strenge Literal- und Mapping-Typen. Es gibt auch ein neues Flag, das Fehler bei der Behandlung von Indexsignaturen verhindert, und die JavaScript-Obermenge erlaubt jetzt rekursive bedingte Typen.

Die neuen Schriftarten für Vorlagen erweitern Literaltypen von Zeichenfolgen auf dieselbe Weise wie Vorlagenliteratur in JavaScript Zeichenfolgen erweitern: Die einzelnen Zeichenfolgenliterale können Vorlagen mit der Syntax sein ${expression} enthalten. In String-Literaturtypen werden mehrere Strings verwendet, um die zulässigen Werte zu definieren.

Die Verwendung ist unter anderem nützlich, wenn wörtliche Arten von Zeichenfolgen wie im folgenden Beispiel aus dem TypeScript-Blog, abgekürzt mit einer Donut-Referenz, verbunden werden:

type VerticalAlignment = "top" | "middle" | "bottom";
type HorizontalAlignment = "left" | "center" | "right";

// Takes
//   | "top-left"    | "top-center"    | "top-right"
//   | "middle-left" | "middle-center" | "middle-right"
//   | "bottom-left" | "bottom-center" | "bottom-right"
declare function 
  setAlignment(value: 
              `${VerticalAlignment}-${HorizontalAlignment}`): void;

setAlignment("top-left");   // works!
setAlignment("top-middel"); // error!
setAlignment("top-pot");    // error! 

Der Code kombiniert die beiden strengen Literaltypen VerticalAlignment und HorizontalAlignment und bietet somit jede Kombination von vertikaler und horizontaler Ausrichtung, d.h. Insgesamt neun definierte Werte aus drei mal drei Spezifikationen. Neben den einfachen, viel komplexeren Beispielen, die sich auch mit der Entwicklung des jeweiligen Typs befassen, finden Sie im Blog.

Zugeordnete Typen ermöglichen die Erstellung von Objekttypen mithilfe von Schlüsseln wie in type Beispiel = {[K in "a" | "b" | "c"]?: boolean}; oder als Erweiterung anderer Typen wie in type Partial<T> = {[K in keyof T]?: T[K]};.

Mit TypeScript 4.1 ist es möglich, die Schlüssel manuell über das Schlüsselwort einzugeben as bestimmen. In Kombination mit den Literal-Vorlagentypen können neue Eigenschaftsnamen basierend auf vorhandenen Namen generiert werden, wie im folgenden Artikel aus dem TypeScript-Blog zum Erstellen von Getter-Wraps für die Variablen in einer Schnittstelle gezeigt:

Siehe auch  Schnell zum richtigen Wein gelangen

type Getters<T> = {
  [K in keyof T as `get${capitalize K}`]: () => T[K]
};

interface Person {
  name: string;
  age: number;
  location: string;
}

type LazyPerson = Getters<Person>;

Die mit der aktuellen Version eingeführten rekursiven bedingten Typen ermöglichen eine flexiblere Behandlung von bedingten Typen. Insbesondere dürfen sich diese nun auf sich selbst beziehen. Der Blog-Beitrag enthält ein Beispiel für das Auffinden der Typen in eingebetteten Arrays:

type ElementType<T> =
  T extends ReadonlyArray<infer U> ? ElementType<U> : T;

function deepFlatten<T extends readonly unknown[]>(x: T): 
  ElementType<T>[] {
    throw "not implemented";
}

// All of these return the type 'number[]':
deepFlatten([1, 2, 3]);
deepFlatten([[1], [2, 3]]);
deepFlatten([[1], [[2]], [[[3]]]]);

In dem Blogbeitrag wird jedoch ausdrücklich darauf hingewiesen, dass rekursive Typen die für die Typprüfung erforderliche Zeit erheblich verlängern können und dass Entwickler rekursive bedingte Typen verantwortungsbewusst und sparsam verwenden müssen.

Erwähnenswert ist auch der neu eingeführte TypeScript-Parameter --noUncheckedIndexedAccess für den Zugriff auf Indexsignaturen:

interface Options {
  path: string;
  permissions: number;

  // Extra properties are caught by this index signature.
  [propName: string]: string | number;
}

Zuvor ging TypeScript davon aus, dass alle Eigenschaften vom Typ waren string oder number muss sein. Mit dem neuen Flag berücksichtigt der Compiler den direkten Zugriff auf Eigenschaften wie in foo.bar oder über den Index wie in foo["bar"] möglicherweise undefined könnte sein.

Andere Innovationen wie die Verwendung von paths ohne baseUrl Lass es TypeScript-Blog entfernen. Wenn Sie die Beta testen möchten, können Sie Herunterladen von NuGet oder über npm mit dem Befehl npm install typescript installieren. Der Release-Kandidat wird im Oktober bekannt gegeben, und die Erfahrung hat gezeigt, dass die endgültige Version wie bei TypeScript 4.0 kurz danach erwartet werden kann.

Siehe auch  Öffentlicher Dienst: Vereinbarung über Tarifverhandlungen


(rme)

Zur Startseite

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Copyright Buzz Nice © All rights reserved.