¿TypeScript permite los alias de tipo?

90

Así que me gustaría poder usar un alias para un tipo feo que se parece a esto:

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

Algo como:

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

¿Hay alguna forma de hacer alias de tipo en TypeScript?

Tridente D'Gao
fuente
Como respondió Ryan. Sin embargo, una cosa que falta es la sobrecarga del operador, por lo que no puede extender algo como el número
basarat
1
Hace 3 días, mecanografiado introdujo alias de tipo: blogs.msdn.com/b/typescript/archive/2014/11/18/…
oculto el
Excelente pregunta, ¡Gracias!
Pedro Ferreira

Respuestas:

124

Desde la versión 1.4, Typescript admite alias de tipo ( fuente ).

Alias ​​de tipo

Ahora puede definir un alias para un tipo usando la palabra clave type:

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

Los alias de tipo son exactamente iguales a sus tipos originales; son simplemente nombres alternativos.

Y desde la versión 1.6, TypeScript admite alias de tipo genérico ( fuente ).

Alias ​​de tipo genérico

Antes de TypeScript 1.6, los alias de tipo estaban restringidos a ser alias simples que acortaban los nombres de tipo largo. Desafortunadamente, sin poder hacerlos genéricos, tenían un uso limitado. Ahora permitimos que los alias de tipo sean genéricos, dándoles una capacidad expresiva completa.

type switcharoo<T, U> = (u: U, t:T)=>T;
var f: switcharoo<number, string>;
f("bob", 4);
Mariusz Pawelski
fuente
Los alias de tipo en 1.4 no admiten parámetros de tipo, lo que los hace en su mayoría inútiles al menos en mi entorno, donde la mayoría de las cosas son genéricas. Hay otra solicitud en discusión para agregar parámetros de tipo a los alias: github.com/Microsoft/TypeScript/issues/1616 Con suerte, se generará suficiente interés para esta característica, para que cobre vida.
Trident D'Gao
3
Según el comentario de @AlekseyBykov, ¡los alias de tipo genérico ya están disponibles! Ver github.com/Microsoft/TypeScript/pull/3397
brynb
Encuentro que estos alias de tipo son inútiles, ya que no puede usarlos para construir instancias. Esta falla:type MyMap = Map<string, string>; let map = new MyMap();
jlh
@jlh Bueno, los alias de tipos (y los tipos en general) se borran después de la compilación. Entonces, para que funcione como desea, TS necesitaría reescribir su newllamada o generar algún código para el tipo alias. Y esto, en general, va en contra de la filosofía y los objetivos de diseño de TS . Siempre puede crear su propia MyMapclase o función que envuelva el subyacenteMap<string, string>;
Mariusz Pawelski
@MariuszPawelski Sí, terminé envolviéndolo, pero es una molestia si el tipo subyacente tiene muchos métodos que desea usar. Sería trivial si fuera posible simplemente extender estos tipos, pero eso tampoco funciona, al menos no lo hace Map, hay un problema abierto para eso.
Jlh
11

TypeScript admite importaciones, por ejemplo:

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

Actualización 1

Desde TS 1.4 podemos usar declaraciones de tipo:

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

var handler: MyHandler;

Desde TS 1.6 podemos usar declaraciones de tipos locales:

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
fuente
8

La solución de un pobre es declarar una variable ficticia (por ejemplo t) con el tipo deseado y usar en typeof tlugar de la expresión de tipo largo:

var t: {(x: número, f: {(foo: cadena, bar: booleano): void}): void};

var f: tipo de t;
var g: tipo de t;
Martin Jambon
fuente