使用参数作为泛型类型,并为其指定默认值

时间:2016-07-06 20:16:04

标签: typescript

我在构造函数中有一个简单的类Board,其中包含参数widthheighttypes。高度和宽度始终具有类型number,但types是任何类型的数组。

我想要做的是使用泛型types捕获<T>参数的类型。然后T可用于返回使用this.types的另一个函数。问题是我还想将默认类型设置为数字数组。

这是我认为可行的,但我目前收到错误Type 'number[]' is not assignable to Type 'T[]' Type 'number' is not assignable to Type 'T'

export class Board<T> {
    constructor(width: number = 8, height: number = 8, types: T[] = [0, 1, 2, 3, 4, 5, 6]) {
        this.width = width;
        this.height = height;
        this.types = types;
    }
    getTypes(): T[] {
        return this.types;
    }
}

我做错了什么?或者甚至可以进行此设置?

我最终想要的是将T分配给this.types在实例化类之后最终的类型。如果我致电new Board(8, 8, ['a', 'b', 'c', 'd']);,我希望知道T应为string。如果我只是致电new Board(),我们就知道T应该是number

1 个答案:

答案 0 :(得分:3)

更好的方法使用advanced types

class Board<T> {
    private width:number;
    private height:number;
    private types:T[]|number[];

    constructor(width:number = 8, height:number = 8, types:T[]|number[] = [1, 2]) {
        this.width = width;
        this.height = height;
        this.types = types;
    }

    getTypes():T[]|number[] {
        return this.types;
    }
}

https://jsfiddle.net/r8uqn760/2/

旧答案,使用type alias

此方法将始终允许 this.types 数组中的数字。

例如new Board(0, 0, [0, "foo"])将在汇编时通过,我认为这不是你想要发生的事情。

type X<Y> = number | Y;

class Board<T> {
    private width:number;
    private height:number;
    private types:X<T>[];

    constructor(width:number = 8, height:number = 8, types = [1,2] as X<T>[]) {
        this.width = width;
        this.height = height;
        this.types = types;
    }

    getTypes():X<T>[] {
        return this.types;
    }
}

Fiddle