如何在 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)
)。如果 rows
和 cols
是数字,我想创建一个二维数组,然后将该新数组传回构造函数。
递归构造函数调用在 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
}
}
我有一个 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)
)。如果 rows
和 cols
是数字,我想创建一个二维数组,然后将该新数组传回构造函数。
递归构造函数调用在 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
}
}