指定参数数组长度



是否可以在参数设置时指定双数组的长度?例如:

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'],
]);

限制是MatrixArray4x4Array4不能扩展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类的所有方法,但没有元素定义。然后,我扩展了该接口,以创建新的有限长度数组接口。

相关内容

  • 没有找到相关文章

最新更新