Допускает ли TypeScript псевдонимы типов?

91

Поэтому я хотел бы использовать псевдоним для уродливого типа, который выглядит так:

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

Что-то типа:

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

Есть ли способ использовать псевдонимы типов в TypeScript?

Трезубец Д'Гао
источник
Как ответил Райан. Не хватает одной вещи, так это перегрузки оператора, поэтому вы не можете расширить что-то вроде числа
basarat
1
3 дня назад в машинописном тексте появились псевдонимы типов: blogs.msdn.com/b/typescript/archive/2014/11/18/…
скрыто
Отличный вопрос, спасибо!
Педро Феррейра

Ответы:

126

Начиная с версии 1.4 Typescript поддерживает псевдонимы типов ( источник ).

Типовые псевдонимы

Теперь вы можете определить псевдоним для типа с помощью ключевого слова type:

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

Псевдонимы типов точно такие же, как и их исходные типы; это просто альтернативные имена.

А начиная с версии 1.6 Typescript поддерживает псевдонимы универсального типа ( источник ).

Псевдонимы универсального типа

Вплоть до TypeScript 1.6 псевдонимы типов ограничивались простыми псевдонимами, сокращающими длинные имена типов. К сожалению, без возможности сделать их универсальными, они имели ограниченное применение. Теперь мы позволяем псевдонимам типов быть универсальными, что дает им полную выразительность.

type switcharoo<T, U> = (u: U, t:T)=>T;
var f: switcharoo<number, string>;
f("bob", 4);
Мариуш Павельски
источник
Псевдонимы типов в 1.4 не поддерживают параметры типа, что делает их практически бесполезными, по крайней мере, в моих настройках, где большинство вещей являются общими. Обсуждается еще один запрос на добавление параметров типа к псевдонимам: github.com/Microsoft/TypeScript/issues/1616. Надеюсь, эта функция вызовет достаточный интерес, чтобы она ожила.
Trident D'Gao
3
Согласно комментарию @AlekseyBykov - псевдонимы универсального типа теперь доступны! См github.com/Microsoft/TypeScript/pull/3397
brynb
Я считаю эти псевдонимы типов бесполезными, поскольку вы не можете использовать их для создания экземпляров. Это не удается:type MyMap = Map<string, string>; let map = new MyMap();
jlh
@jlh Ну, алиасы типов (и типы в целом) после компиляции стираются. Итак, чтобы заставить его работать так, как вы хотите, TS нужно будет переписать ваш newвызов или сгенерировать код для псевдонима типа. И это в целом противоречит философии TS и целям дизайна . Вы всегда можете создать свой собственный MyMapкласс или функцию, которая будет Map<string, string>;
оберткой
@MariuszPawelski Да, я закончил его упаковкой, но это больно, если у базового типа есть много методов, которые вы хотите использовать. Было бы тривиально, если бы можно было просто расширить эти типы, но это тоже не работает, по крайней мере, для Mapэтого есть открытая проблема.
jlh
11

TypeScript поддерживает импорт, например:

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

Обновление 1

Начиная с TS 1.4, мы можем использовать объявления типов:

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

var handler: MyHandler;

Начиная с TS 1.6 мы можем использовать объявления локальных типов:

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
источник
8

Решение для бедняков - объявить фиктивную переменную (например t) с желаемым типом и использовать typeof tвместо выражения длинного типа:

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

var f: typeof t;
var g: typeof t;
Мартин Джэмбон
источник