2016-07-06 46 views
2

我有一個簡單的類Board參數width,heighttypes在構造函數中。高度和寬度將始終爲number,但types是任何類型的數組。使用參數作爲通用類型,並給它一個默認的賦值

我想要做的是使用通用類型<T>捕獲types參數的類型。然後,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。使用advanced types

+0

不能使用數字作爲默認值的數組,T's的'數組,因爲你不知道是否T''會'number'。如果你打電話給新董事會(8,8)',會發生什麼? –

+0

好的,這是有道理的,但我怎麼能設置'T'依賴於'this.types'分配給什麼? – gliemezis

回答

3

更好的方法:使用type alias

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/

舊答案

這種方法將總是允許在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

+0

我非常喜歡這個,它可以爲我想要做的事情工作。我很好奇,但是如果有一種方法可以在引用'this.types'的類中設置別名。可能類似於'type Z = typeof this.orbs'和'getTypes():Z [] {return this.types}''。我沒有看到如何讓這個想法工作。 – gliemezis

+0

無法在類中創建類型別名。由於舊的漏洞存在,請查看最新的答案。 – Granga

+0

好的。這個答案肯定給了我需要的信息。真的,我正在尋找的是在類中使用類型別名的方式,但是,它不能完成。在這種情況下,最好只使用'types:any []'。它不那麼具體,但那是沒問題的。 – gliemezis

相關問題