在typescript中是否有定义固定大小数组的方法。比方说,例如,在函数定义中,我需要能够说
coord: (c:any) => number[]; //how to say it is an array of size 4
我可以像定义哈希映射一样定义接口
//this doesn't work
interface IArray{
[number]
}
并将最大长度限制为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
:
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],
];