是否可以在参数设置时指定双数组的长度?例如:
class Matrix4x4{
constructor(matrix: /*must be a 4x4 number matrix*/){
}
}
答案 0 :(得分:1)
是的,可以使用元组。 (见: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){}
}
您可以针对您可能需要的任何尺寸矩阵进行更改。
答案 1 :(得分:1)
如果您不需要限制数组的长度,并且只需要定义数组的元素,您可以使用像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],
});
错误:3
中缺少属性MatrixData4x4
。
new Matrix4x4([
[1, 3, 3, 7],
[1, 9, 8, 4],
[9, 0, 0, 1],
]);
错误:3
中缺少属性Array4<number>
。
new Matrix4x4([
[1, 3, 3],
[1, 9, 8, 4],
[9, 0, 0, 1],
[9, 0, 0, 1],
]);
错误:类型string
无法分配给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
类中没有元素定义的所有方法。然后我扩展了该接口以创建新的有限长度的数组接口。