是否可以在参数设置时指定双数组的长度?例如:
class Matrix4x4{
constructor(matrix: /*must be a 4x4 number matrix*/){
}
}
是的,可以使用元组。(见:https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#3.3.3)
之类的…
type TMatrixRow4x4 = [number, number, number, number];
type TMatrix4x4 = [TMatrixRow4x4, TMatrixRow4x4, TMatrixRow4x4, TMatrixRow4x4];
class Matrix4x4{
constructor(matrix: TMatrix4x4){}
}
你可以根据需要改变矩阵的大小
如果你不需要限制数组的长度,而只需要定义数组的元素,你可以使用像David D.那样的元组。的答案。但是,在您的情况下,这将与执行number[][]
相同。
否则就有点棘手了
interface Array4<T> {
0: T;
1: T;
2: T;
3: T;
// Copied directly from the 'lib.d.ts' file
push(...items: T[]): number;
}
interface MatrixArray4x4<T> {
0: T;
1: T;
2: T;
3: T;
// Copied directly from the 'lib.d.ts' file
map<U>(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[];
}
// Alias for clarity
type MatrixData4x4 = MatrixArray4x4<Array4<number>>;
class Matrix4x4{
constructor(matrix: MatrixData4x4){
}
}
作品var matrix: MatrixData4x4 = [
[1, 3, 3, 7],
[1, 9, 8, 4],
[9, 0, 0, 1],
[2, 0, 3, 8],
];
a
的类型为number
。
var a = matrix[0][0];
b
的类型为any
。如果设置了--noImplicitAny
,则会出现类型错误。
var b = matrix[4][0];
作品new Matrix4x4([
[1, 3, 3, 7],
[1, 9, 8, 4],
[9, 0, 0, 1],
[2, 0, 3, 8],
]);
错误:属性4
不能在MatrixData4x4
中分配。
new Matrix4x4([
[1, 3, 3, 7],
[1, 9, 8, 4],
[9, 0, 0, 1],
[2, 0, 3, 8],
[1, 2, 3, 4],
]);
错误:文字对象中缺少属性map
。
new Matrix4x4({
0: [1, 3, 3, 7],
1: [1, 9, 8, 4],
2: [9, 0, 0, 1],
3: [2, 0, 3, 8],
});
错误:MatrixData4x4
中缺少3
属性。
new Matrix4x4([
[1, 3, 3, 7],
[1, 9, 8, 4],
[9, 0, 0, 1],
]);
错误:属性Array4<number>
中缺少3
.
new Matrix4x4([
[1, 3, 3],
[1, 9, 8, 4],
[9, 0, 0, 1],
[9, 0, 0, 1],
]);
错误:Type string
not assignable to number
.
new Matrix4x4([
[1, '3', 3, 5],
[1, 9, 8, 4],
[9, '0', 0, 1],
[9, 0, 0, '1'],
]);
限制是MatrixArray4x4
和Array4
不能扩展Array
。因此,如果Array
方法在它上面被调用并且它们没有被定义,将会发生类型错误。
可以工作,因为map
已经在上面的MatrixArray4x4
中定义了。
matrix.map((x) => x[3]);
可以工作,因为push
已经在上面的Array4
中定义了。
matrix.map((arr) => arr.push(4));
错误:属性push
在类型MatrixArray4x4
上不存在。
matrix.push([1, 2, 3, 4]);
错误:属性map
在类型Array4
上不存在。
matrix.map((arr) => {
arr.map((x) => x[3]);
});
我解决这个问题的方法是创建一个名为ArrayMethods
的接口,其中包含来自Array
类的所有方法,但没有元素定义。然后,我扩展了该接口,以创建新的有限长度数组接口。