Typescript: интерфейс для массива фиксированного размера

Есть ли способ в typescript определить массив фиксированного размера. скажем, например, в определении функции, мне нужно сказать

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

Можно ли определить интерфейс, как мы определяем хэш-карту

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

а также ограничить максимальную длину 4.

Ответ 1

Это неловко, но вы можете сделать это вот так:

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

Вы можете вернуть 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(','));

Ответ 3

Предотвращение использования пользователем индекса в массиве вне границ - это не то, что может сделать даже С#. например что мешает вам делать:

var index = 123; 
sizeFour[index];

Или даже запрашивать индекс с сервера?

Такой короткий ответ "нет декларативного способа предотвратить это, если вы настаиваете на использовании []"

Вы всегда можете сделать

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

а затем используйте . i.e. bar.one