2014-11-14 23 views

cevap

36

ama seni düşünüyorum Aşağıdakilerle istediğinizi başarabilirsiniz:

type IData = [string, number, number]; 
sonra

var data: IData; 

Joe Skeen en fazla bu TypeScript Playground example

1

yazarak aynı şeyi yapmak mümkün olacaktır böylece bir arayüz IDATA nasıl yazılır

var data: [string, number, number]; 

bir dize de. yeni özelliklerden bazıları gelmesiyle, bu tür birlik tipleri gibi, sen kabaca istediğini alabilirsiniz

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

başlığın içindeki değerler için tip destek vermez, bu inteface beyanı kullanma. : '( –

11

Not:

Sen gibi bir arayüzde bir Tuple kullanabilirsiniz. spec son taslak

Aşağıdaki kod bu görünebilir nasıl bir örnek göstermektedir (https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#3.3.3 bakınız) bu satırlar boyunca bir örnek içerir:

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

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

Eğer ana daldan en son kod kapmak ise ve yukarıda derlemek, bunu geçerli olarak 'x' için atama algılar nerede olduğunu görmek ve bir hata olarak 'y' için atama edeceğiz: Bu eski bir soru olduğunu biliyorum

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'. 
+0

Bu, derleme sırasında tuple içinde tip kontrolleri garanti etmek için çok iyi bir çözümdür. Başparmak yukarıya! Ne yazık ki, WebStorm 2016.2.3 bu kodu geçersiz olarak işaretler ancak WebStorm'un TypeScript desteği tesadüftür, bu yüzden sadece WebStorm'un hatasıdır. . :) –

+0

'arabirimi değil KeyValuePair Array {0: dize; 1: sayı; } , (özel bir tuple türü ile): 'türünde KeyValuePair = [string, number]' ile aynı? –

1

Çok daha boilerplateness yaklaşımında görüyoruz, ancak zaman tipi kontrolleri derlemek veriyor olabilir. Ve Demirbaş util kod yazma sadece bir kez ..;)

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]; 
} 

diziler ile kullanılabilir:

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]); 
} 
İlgili konular