Ответ 1
Я знаю, что это старый вопрос, но я думаю, что вы можете выполнить то, что хотите, со следующим:
type IData = [string, number, number];
затем
var data: IData;
Вы можете увидеть это в этом TypeScript Пример игровой площадки
Приятно видеть выпуск TypeScript 1.3, но как написать интерфейс представляет тип кортежа?
например.
var data: [string, number, number];
Как написать IDATA интерфейса, чтобы я мог сделать то же самое, написав
var data: IData;
Я знаю, что это старый вопрос, но я думаю, что вы можете выполнить то, что хотите, со следующим:
type IData = [string, number, number];
затем
var data: IData;
Вы можете увидеть это в этом TypeScript Пример игровой площадки
Обратите внимание, что с появлением некоторых новых функций, таких как типы объединения, вы можете получить примерно то, что хотите. Последний проект спецификации содержит пример в этих строках (см. 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'.
Вы не можете создать интерфейс из Tuple, например, вы также не можете сделать его из строки.
Вы можете использовать Tuple в интерфейсе, например:
interface IDATA {
value: [number, string];
}
Гораздо больше подхода котельной, чем Джо Скин, но позволяет проверять тип времени компиляции. И код шаблона утилиты пишут только один раз..;)
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]);
}