Как написать интерфейс представляет тип кортежа в TypeScript?

Приятно видеть выпуск TypeScript 1.3, но как написать интерфейс представляет тип кортежа?

например.

var data: [string, number, number];

Как написать IDATA интерфейса, чтобы я мог сделать то же самое, написав

var data: IData;

Ответы

Ответ 1

Я знаю, что это старый вопрос, но я думаю, что вы можете выполнить то, что хотите, со следующим:

type IData = [string, number, number];

затем

var data: IData;

Вы можете увидеть это в этом TypeScript Пример игровой площадки

Ответ 2

Обратите внимание, что с появлением некоторых новых функций, таких как типы объединения, вы можете получить примерно то, что хотите. Последний проект спецификации содержит пример в этих строках (см. https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#3.3.3)

В приведенном ниже коде показан пример того, как это может выглядеть:

interface KeyValuePair extends Array<string | number> { 0: string; 1: number; }

var x: KeyValuePair = ["test", 42]; // OK
var y: KeyValuePair = [42, "test"]; // Error

Если вы возьмете последний код из главной ветки и скомпилируете вышеизложенное, вы увидите, где он определяет присвоение "x" как действительного, а присвоение "y" в качестве ошибки:

S:\src\TypeScript\bin>node tsc c:\temp\tuple.ts
c:/temp/tuple.ts(4,5): error TS2323: Type '[number, string]' is not assignable to type 'KeyValuePair'.
  Types of property '0' are incompatible.
    Type 'number' is not assignable to type 'string'.

Ответ 3

Вы не можете создать интерфейс из Tuple, например, вы также не можете сделать его из строки.

Вы можете использовать Tuple в интерфейсе, например:

interface IDATA {
   value: [number, string];
}

Ответ 4

Гораздо больше подхода котельной, чем Джо Скин, но позволяет проверять тип времени компиляции. И код шаблона утилиты пишут только один раз..;)

function usage(t: CortegeOf2<boolean, string>) {
    get1(t).toLowerCase(); //ok

    // var trash1 = t[2]; //runtime error
    // var e0 = get2(t); //compile-time error we cannot get 2nd element cuz t has only 0th and 1st

    // var trash2: string = t[1]; //sadly that syntax allows to pass value somewhere, where expected another type
    // trash2.toUpperCase(); //runtime error

    // var e2: string = get1(t); //but that usage will not allow that pass
}


export interface CortegeOf1<T0> {
    0: T0;
}

export interface CortegeOf2<T0, T1> extends CortegeOf1<T0> {
    1: T1;
}

export interface CortegeOf3<T0, T1, T2> extends CortegeOf2<T0, T1> {
    2: T2;
}

export function get0<T>(cortege: CortegeOf1<T>): T {
    return cortege[0];
}

export function get1<T>(cortege: CortegeOf2<any, T>): T {
    return cortege[1];
}

export function get2<T>(cortege: CortegeOf3<any, any, T>): T {
    return cortege[2];
}

Может использоваться с массивами:

export function joinTwo<A, B>(a: Promise<A>, b: Promise<B>): Promise<CortegeOf2< A, B >> {
    return Promise.all([a, b]);
}

function joinThree<A, B, C>(a: Promise<A>, b: Promise<B>, c: Promise<C>): Promise<CortegeOf3< A, B, C >> {
    return Promise.all([a, b, c]);
}