TypeScript autorise-t-il les alias de type?

90

Je souhaite donc pouvoir utiliser un alias pour un type laid qui ressemble à ceci:

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

Quelque chose comme:

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

Existe-t-il un moyen de faire des alias de type dans TypeScript?

Trident D'Gao
la source
Comme Ryan a répondu. Une chose qui manque cependant est la surcharge de l'opérateur, vous ne pouvez donc pas étendre quelque chose comme le nombre
basarat
1
Il y a 3 jours, typescript a introduit les alias de type: blogs.msdn.com/b/typescript/archive/2014/11/18/…
masqué le
Excellente question, merci!
Pedro Ferreira

Réponses:

124

Depuis la version 1.4, Typescript prend en charge les alias de type ( source ).

Alias ​​de type

Vous pouvez maintenant définir un alias pour un type à l'aide du mot-clé type:

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

Les alias de type sont exactement les mêmes que leurs types d'origine; ce sont simplement des noms alternatifs.

Et à partir de la version 1.6, Typescript prend en charge les alias de type générique ( source ).

Alias ​​de type générique

Avant TypeScript 1.6, les alias de type étaient limités à de simples alias qui raccourcissaient les noms de type longs. Malheureusement, sans pouvoir les rendre génériques, leur utilisation était limitée. Nous autorisons maintenant les alias de type à être génériques, ce qui leur donne une capacité d'expression complète.

type switcharoo<T, U> = (u: U, t:T)=>T;
var f: switcharoo<number, string>;
f("bob", 4);
Mariusz Pawelski
la source
Les alias de type dans 1.4 ne prennent pas en charge les paramètres de type, ce qui les rend pratiquement inutiles au moins dans mon contexte où la plupart des choses sont génériques. Il y a une autre demande dans la discussion pour ajouter des paramètres de type aux alias: github.com/Microsoft/TypeScript/issues/1616 J'espère que l'intérêt sera suffisamment généré pour cette fonctionnalité, afin qu'elle prenne vie.
Trident D'Gao
3
Selon le commentaire de @AlekseyBykov - les alias de type générique sont maintenant en ligne! Voir github.com/Microsoft/TypeScript/pull/3397
brynb
Je trouve que ces alias de type sont inutiles, car vous ne pouvez pas les utiliser pour construire des instances. Cela échoue:type MyMap = Map<string, string>; let map = new MyMap();
jlh
@jlh Eh bien, les alias de type (et les types en général) sont effacés après la compilation. Donc, pour que cela fonctionne comme vous le souhaitez, TS aurait besoin de réécrire votre newappel ou de générer du code pour l'alias de type. Et cela en général est contraire à la philosophie TS et aux objectifs de conception . Vous pouvez toujours créer votre propre MyMapclasse ou fonction qui enveloppe le sousMap<string, string>;
Mariusz Pawelski
@MariuszPawelski Oui, j'ai fini par l'envelopper, mais c'est pénible si le type sous-jacent a beaucoup de méthodes que vous souhaitez utiliser. Ce serait trivial s'il était possible d'étendre simplement ces types, mais cela ne fonctionne pas non plus, du moins ce n'est pas le cas Map, il y a un problème ouvert pour cela.
jlh
11

TypeScript prend en charge les importations, par exemple:

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();
}

Mise à jour 1

Depuis TS 1.4, nous pouvons utiliser des déclarations de type:

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

var handler: MyHandler;

Depuis TS 1.6, nous pouvons utiliser des déclarations de type local:

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";
    }
}
TSV
la source
8

La solution d'un pauvre est de déclarer une variable factice (par exemple t) avec le type souhaité et d'utiliser à la typeof tplace de l'expression de type long:

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

var f: type de t;
var g: type de t;
Martin Jambon
la source