Programmiersprache: TypeScript 4.1 erweitert Mapping- und String-Literal-Typen
3 min readMicrosoft 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.
Vorlagen in Literaltypen
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.
Erweiterte zugeordnete Typen
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:
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>;
Bedingt mit sich selbst verbunden
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.
Strengere Indexsignaturen
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.
(rme)
“Zertifizierter Schriftsteller. Totaler Problemlöser. Alkoholiker. Entdecker. Wütend bescheidener Student. Wannabe-Unternehmer. Twitter-Liebhaber.”