typescript:固定大小数组的接口

时间:2014-03-28 18:43:39

标签: typescript

在typescript中是否有定义固定大小数组的方法。比方说,例如,在函数定义中,我需要能够说

coord: (c:any) => number[]; //how to say it is an array of size 4

我可以像定义哈希映射一样定义接口

//this doesn't work
interface IArray{
  [number]
}

并将最大长度限制为4。

4 个答案:

答案 0 :(得分:14)

您可以返回tuple而不是数组:

type array_of_4 = [number, number, number, number];

var myFixedLengthArray :array_of_4 = [1,2,3,4];

// the tuple can be used as an array:
console.log(myFixedLengthArray.join(','));

答案 1 :(得分:6)

这有点尴尬,但你可以这样做:

interface SizeFour<T> {
    0: T;
    1: T;
    2: T;
    3: T;
}

function fn(): SizeFour<string> {
    // Need to cast
    return <any>['', '', '', ''];   
}

var x = fn();
var a = x[0]; // a: string
var b = x[4]; // b: any; error if --noImplicitAny

答案 2 :(得分:3)

防止有人在边界之外的数组中使用索引不是C#可以做的事情。例如什么阻止你做:

var index = 123; 
sizeFour[index];

甚至从服务器请求索引?

如此简短的回答“如果您坚持使用[]”,则没有一种声明性的方法可以阻止这种情况。

你可以随时

var bar = {
   one : 'something',
   two: 'somethingelse'
   // etc. 
}

然后只使用.,即bar.one

答案 3 :(得分:0)

有一种(hacky)方法可以做到这一点。它基本上是向内部数组接口添加一个新的可选元素,即不可能的类型 never。但是,如果第三个元素是 undefined,这将不起作用。

以下代码使用最新的 Typescript v4.3.2

TS playground link

interface ArraySizeOfTwo {
  0: number;
  1: number;
  2?: never;
}

interface ArrayList {
  [index: number]: ArraySizeOfTwo;
}

const myArray: ArrayList = [
  [1, 2],
  [15, 20],
];

// Error: Type 'number' is not assignable to type 'undefined'.
const myArray2: ArrayList = [
  [1, 2, 3],
  [15, 20],
];

// Error: Property '1' is missing in type '[number]' but required in type 'ArraySizeOfTwo'.
const myArray3: ArrayList = [
  [1, 2],
  [15],
];

// Error: Type 'undefined' is not assignable to type 'number'.
const myArray4: ArrayList = [
  [1, 2],
  [15, undefined],
];

// no errors :(
const myArray5: ArrayList = [
  [1, 2],
  [15, 20, undefined],
];