Erlaubt TypeScript Typ-Aliase?


90

Ich wünschte, ich könnte einen Alias ​​für einen hässlichen Typ verwenden, der so aussieht:

Maybe<Promise<Paged<Carrier>, Problem>>[]

Etwas wie:

import Response = Maybe<Promise<Paged<Carrier>, Problem>>[];

Gibt es eine Möglichkeit, Typ-Aliase in TypeScript zu erstellen?


Als Ryan antwortete. Eine Sache, die jedoch fehlt, ist die Überladung des Operators, so dass Sie so etwas wie number nicht erweitern können
— basarat

1
Vor 3 Tagen führte Typoskript Typ-Aliase ein: blogs.msdn.com/b/typescript/archive/2014/11/18/…
— versteckt am


Hervorragende Frage, danke!
— Pedro Ferreira

Antworten:


124

Ab Version 1.4 unterstützt Typescript Typaliasnamen ( Quelle ).

Geben Sie Aliase ein

Sie können jetzt einen Alias ​​für einen Typ mit dem Schlüsselwort type definieren:

type PrimitiveArray = Array<string|number|boolean>;
type MyNumber = number;
type NgScope = ng.IScope;
type Callback = () => void;

Typ-Aliase sind genau die gleichen wie ihre ursprünglichen Typen. Sie sind einfach alternative Namen.

Ab Version 1.6 unterstützt Typescript generische Typ-Aliase ( Quelle ).

Generische Typ-Aliase

Vor TypeScript 1.6 beschränkten sich Typ-Aliase auf einfache Aliase, die lange Typnamen verkürzten. Leider hatten sie, ohne diese Generika herstellen zu können, nur eine begrenzte Verwendung. Wir erlauben jetzt, dass Typ-Aliase generisch sind, wodurch sie die volle Ausdrucksfähigkeit erhalten.

type switcharoo<T, U> = (u: U, t:T)=>T;
var f: switcharoo<number, string>;
f("bob", 4);

Typ-Aliase in 1.4 unterstützen keine Typparameter, was sie zumindest in meiner Einstellung, in der die meisten Dinge generisch sind, größtenteils unbrauchbar macht. Es gibt eine weitere Anfrage zum Hinzufügen von Typparametern zu Aliasen: github.com/Microsoft/TypeScript/issues/1616 Hoffentlich wird genug Interesse für dieses Merkmal generiert, damit es zum Leben erweckt wird.
— Trident D'Gao

3
Laut dem Kommentar von @AlekseyBykov sind Aliase vom generischen Typ jetzt live! Siehe github.com/Microsoft/TypeScript/pull/3397
— Brynb

Ich finde diese Typ-Aliase nutzlos, da Sie sie nicht zum Erstellen von Instanzen verwenden können. Dies schlägt fehl:type MyMap = Map<string, string>; let map = new MyMap();
— jlh

@jlh Nun, Typ-Aliase (und Typen im Allgemeinen) werden nach der Kompilierung gelöscht. Damit es so funktioniert, wie Sie es möchten, müsste TS Ihren newAufruf neu schreiben oder Code für Typalias generieren. Und dies widerspricht im Allgemeinen der TS-Philosophie und den Designzielen . Sie können jederzeit eine eigene MyMapKlasse oder Funktion erstellen , die den zugrunde liegenden Map<string, string>;
— Wert einschließt

@MariuszPawelski Ja, am Ende habe ich es verpackt, aber es ist schmerzhaft, wenn der zugrunde liegende Typ viele Methoden enthält, die Sie verwenden möchten. Es wäre trivial, wenn es möglich wäre, diese Typen nur zu erweitern, aber das funktioniert auch nicht, zumindest nicht Map, es gibt ein offenes Problem dafür.
— jlh

11

TypeScript unterstützt Importe, z.

module A {
    export class c {
        d: any;
     }
}

module B {
    import moduleA = A;

    var e: moduleA.c = new moduleA.c();
}

module B2 {
    import Ac = A.c;

    var e: Ac = new Ac();
}

Update 1

Seit TS 1.4 können wir Typdeklarationen verwenden:

type MyHandler = (myArgument: string) => void;

var handler: MyHandler;

Seit TS 1.6 können wir lokale Typdeklarationen verwenden:

function f() {
    if (true) {
        interface T { x: number }
        let v: T;
        v.x = 5;
    }
    else {
        interface T { x: string }
        let v: T;
        v.x = "hello";
    }
}

8

Die Lösung eines armen Mannes besteht darin, eine Dummy-Variable (z. B. t) mit dem gewünschten Typ und der gewünschten Verwendung zu deklarierentypeof t anstelle des langen Typausdrucks zu verwenden:

var t: {(x: number, f: {(foo: string, bar: boolean): void}): void};

var f: Typ von t;
var g: Typ von t;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.