如何在TypeScript中编写表示元组类型的接口?

如何在TypeScript中编写表示元组类型的接口?,typescript,Typescript,很高兴看到TypeScript 1.3的发布,但是如何编写表示元组类型的接口呢 例如 如何编写接口IData,以便通过编写 var data: IData; 不能从元组创建接口,就像也不能从字符串创建接口一样 您可以在如下界面中使用元组: interface IDATA { value: [number, string]; } 请注意,随着一些新功能的推出,例如联合类型,您可以大致获得所需的功能。规范的最新草案包含了这些方面的示例(请参见) 下面的代码显示了一个可能的示例: inter

很高兴看到TypeScript 1.3的发布,但是如何编写表示元组类型的接口呢

例如

如何编写接口IData,以便通过编写

var data: IData;

不能从元组创建接口,就像也不能从字符串创建接口一样

您可以在如下界面中使用元组:

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

请注意,随着一些新功能的推出,例如联合类型,您可以大致获得所需的功能。规范的最新草案包含了这些方面的示例(请参见)

下面的代码显示了一个可能的示例:

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

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

我知道这是一个老生常谈的问题,但我认为你可以通过以下几点实现你的目标:

type IData = [string, number, number];
然后


您可以在这个

中看到这一点,它比Joe Skeen的样板方法多得多,但允许编译时类型检查。 样板代码只需编写一次……)

函数用法(t:CortegeOf2){
get1(t).toLowerCase();//确定
//var trash1=t[2];//运行时错误
//var e0=get2(t);//编译时错误我们无法获取第二个元素,因为t只有第0个和第1个元素
//var-trash2:string=t[1];//遗憾的是,语法允许将值传递到其他类型的地方
//trash2.toUpperCase();//运行时错误
//var e2:string=get1(t);//但该用法不允许该过程
}
导出接口目录1{
0:T0;
}
导出接口CortegeOf2扩展了CortegeOf1{
1:T1;
}
导出接口CortegeOf3扩展了CortegeOf2{
2:T2;
}
导出函数get0(cortege:CortegeOf1):T{
返回车队[0];
}
导出函数get1(cortege:CortegeOf2):T{
返回车队[1];
}
导出函数get2(cortege:CortegeOf3):T{
返回车队[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]);
}
导出函数joinTwo(a:Promise,b:Promise):Promise>{
返回承诺。全部([a,b]);
}
函数三(a:允诺,b:允诺,c:允诺):允诺>{
返回承诺。全部([a、b、c]);
}

这是一个非常好的解决方案,可以在编译时保证元组内的类型检查。竖起大拇指!不幸的是,WebStorm 2016.2.3将此代码标记为无效,但WebStorm的TypeScript支持是正确的,所以这只是WebStorm的错。代码将被编译。:)
接口KeyValuePair扩展数组{0:string;1:number;}
是否与(使用自定义元组类型):
类型KeyValuePair=[string,number]
相同?使用此接口声明不会为元组内的值提供类型支持。:'(
type IData = [string, number, number];
var data: IData;
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]);
}