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

vil*_*ane 19 typescript

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

例如

var data: [string, number, number];
Run Code Online (Sandbox Code Playgroud)

如何编写接口IData,以便我能够通过编写来做同样的事情

var data: IData;
Run Code Online (Sandbox Code Playgroud)

Joe*_*een 51

我知道这是一个老问题,但我认为你可以通过以下方式完成你想要的任务:

type IData = [string, number, number];
Run Code Online (Sandbox Code Playgroud)

然后

var data: IData;
Run Code Online (Sandbox Code Playgroud)

您可以在此TypeScript Playground示例中看到此信息

  • 请注意,您现在可以命名元组值:`type Range = [start: number, end: number];` (3认同)

Bil*_*rst 15

请注意,随着一些新功能的出现,例如联合类型,您可以大致得到您想要的内容.该规范的最新草案包含这些行的示例(请参阅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
Run Code Online (Sandbox Code Playgroud)

如果从主分支中获取最新代码并编译上述代码,您将看到它将"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'.
Run Code Online (Sandbox Code Playgroud)


Nex*_*acy 7

有点晚了,但我认为这种方法非常好且简单,可以帮助其他人:

type Type<T> = T;

interface IData extends Type<[number, number, number]>
{

}

var data: IData = ["Some Data", 42, 42];
Run Code Online (Sandbox Code Playgroud)

如果有人需要的话,这也适用于对象:

type Type<T> = T;

interface IData extends Type<{ data: string }>
{

}

var data: IData = { data: "Some Data" };
Run Code Online (Sandbox Code Playgroud)

您还可以这样做:

interface IData
{
    0: string;
    1: number;
    2: number;
}

var data: IData = ["Some Data", 42, 42];
Run Code Online (Sandbox Code Playgroud)