如何在TypeScript中将数组类型隐式转换为元组类型?

现在,args是元组类型的休息参数。如何使这个构造函数也接受数组,当转换为元组类型时,将导致在所述构造函数中指定的类型?

是否可以在没有对构造进行手动断言的情况下完成,例如:

const args = [3, 5];

let vector = new Vector(...args as [number, number]);

或者

const args: [number, number] = [3, 5];

let vector = new Vector(...args);

class Vector {
    x: number;
    y: number;

    constructor(...args: [] | [number] | [number, number]) {
        switch(args.length) {
            case 0:
                this.x = 0;
                this.y = 0;
                break;
            case 1:
                this.x = this.y = args[0];
                break;
            case 2:
                this.x = args[0];
                this.y = args[1];
                break;
        }
    }
}

const args = [3, 5];

let vector = new Vector(...args);

操场

编辑:考虑到@philipp-fritsche 的回答,如果我要添加这些重载怎么办?

class Vector {
    x: number;
    y: number;

    constructor();
    constructor(xy: number);
    constructor(x: number, y: number);
    constructor(arg1?: number, arg2?: number) {
        if(arg1 === undefined) {
            this.x = this.y = 0;
        } else if (arg2 == undefined) {
            this.x = this.y = arg1;
        } else {
            this.x = arg1;
            this.y = arg2;
        }
    }
}

const args = [1, 2];

let vector = new Vector(...args);

回答

在这里定义每个休息的参数没有任何好处。

class Vector {
    x: number;
    y: number;

    constructor(x?: number, y?: number) {
        this.x = x ?? 0
        this.y = y ?? x ?? 0
    }
}

const args = [3, 5];

let vector = new Vector(...args);

这是有效的,因为为 args 推断的类型是number[]. 元素01of number[]arenumber | undefined与 的参数匹配Vector

如果您指定...args: [] | [number] | [number, number], 0,12参数是允许的。但是number[]可以有>=0元素。所以这违反了你的显式类型。


以上是如何在TypeScript中将数组类型隐式转换为元组类型?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>