如何在 TypeScript 中调用递归构造函数?

How do I invoke a recursive construtor in TypeScript?

我有一个 class 构造函数重载,我想根据提供的参数递归调用构造函数。

class Matrix {
    /**
     * Construct a new Matrix given the entries.
     * @param   arr the entries of the matrix
     */
    constructor(arr?: number[][]);

    /**
     * Construct a new Matrix given the size.
     * @param   rows the number of rows (matrix height)
     * @param   cols the number of columns (matrix width)
     */
    constructor(rows?: number, cols?: number);

    constructor(rows: number[][]|number = 0, cols: number = 0) {
        function isMatrixRaw(m: any): m is number[][] {
            // return `true` if m is of type number[][]
        }
        if (isMatrixRaw(rows)) {
            // ...
            // do all the main work here
            // ...
        } else { // typeof rows === 'number' && typeof cols === 'number'
            let m: number[][];
            // ...
            // create a 2D array of numbers, given rows and cols
            // recursively call the constructor with the new 2D array
            // ...
            new Matrix(m) // <-- is this right?
        }
    }
}

如果参数是条目的二维数组,则主要构造函数工作已完成,但我还想要重载:提供行大小和列大小(例如,new Matrix(2,3))。如果 rowscols 是数字,我想创建一个二维数组,然后将该新数组传回构造函数。

递归构造函数调用在 TypeScript 中如何工作?我是叫 new Matrix()return new Matrix()this.constructor()Matrix.constructor() 还是别的什么?

您可以 return 来自构造函数的值。 returned 值将是 new 操作的结果:

class Matrix {
    public rows: number[][];
    constructor(arr: number[][]);
    constructor(rows: number, cols: number);
    constructor(rows: number[][]|number = 0, cols: number = 0) {
        function isMatrixRaw(m: any): m is number[][] { return m instanceof Array; }
        if (!isMatrixRaw(rows)) {
            // init rows with an array
            rows = new Array(rows).fill(0).map(_ => new Array(cols).fill(0));
            return new Matrix(rows);
        } else {
            this.rows = rows; // it's a number[][] now for sure
        }
    }
}

您可以考虑重新组织您的代码,这样就不需要额外的调用了。只需先进行检查,然后进行大部分构造函数工作,就好像调用是使用 number[][]

完成的一样
class Matrix {
    public rows: number[][];
    constructor(arr: number[][]);
    constructor(rows: number, cols: number);
    constructor(rows: number[][]|number = 0, cols: number = 0) {
        function isMatrixRaw(m: any): m is number[][] { return m instanceof Array; }
        if (!isMatrixRaw(rows)) {
            // init rows with an array
            rows = new Array(rows).fill(0).map(_ => new Array(cols).fill(0));
        }
        this.rows = rows; // it's a number[][] now for sure
    }
}