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