指定参数数组长度

时间:2015-08-23 09:36:29

标签: multidimensional-array parameters typescript

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

class Matrix4x4{
    constructor(matrix: /*must be a 4x4 number matrix*/){
    }
}

2 个答案:

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

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