2017-02-16 55 views
0

我目前正在嘗試別名泛化類。我正在使用typescript-collections軟件包並希望進行一些重命名。類型化別名泛化類的實例

class Bar<T> {} 
class Foo = Bar<X>; 

我該如何去做第二行?

+1

你想通過第二行完成什麼?你將如何使用'Foo'? –

+0

我打算在每個地方都用'Foo'替換'Bar '。 '酒吧'是一個很長的名字,來自typescript-collections包,'Foo'是一個更有意義的名字。 – iHowell

+1

你可以只鍵入Foo =欄;但我不確定這會起什麼作用。除了某些地方的類型別名外,您不能使用該類型來創建新對象,例如,只能將其用作類型別名。 – toskv

回答

2

如果你需要的是別名Bar<X>式註釋/在其他地方的提示(如function blah(foo: Bar<X>))。你可以使用下面的語句:

type Foo = Bar<X>; 

注意,你仍然不能做new Foo()中, type語句僅對TypeScript的「類型」部分有貢獻,而對「值」部分不起作用(就像類一樣)。

如果你想要一個實際的類,一個簡單而有效的解決辦法是延長原Bar<X>類,像這樣:

class Foo extends Bar<X> {} 

我個人特別不喜歡這種解決方案雖然,因爲它使你的代碼不太清楚。

+0

有沒有辦法做第二部分,但不只是獲取類型信息? – iHowell

+1

已編輯。再次,我不特別喜歡這個解決方案。 OO繼承不應該用於別名。 –

1

您可以從Bar<X>繼承Foo使一類中預定義的X類型參數:

class Foo extends Bar<X> {} 
1

您可以使用一個類型別名爲@toskv建議:

type Foo = Bar<X>; 

然後你可以使用它作爲一種類型:

let foo: Foo = new Bar<X>(); 

如果你有一個接受的X實例的構造方法,則編譯器會推斷出類型:

class Bar<T> { 
    constructor(x: X) { } 
} 

let foo: Foo = new Bar(); 

如果你想它綁定到特定的泛型約束一個新的類,那麼你就需要做是這樣的:

class Foo extends Bar<X> { ... } 

let foo = new Foo(); 
1

如果你需要的是一個類型別名那麼你可以使用類型來創建這樣說:

type Foo = Bar<X>; 

有了這個,你就可以不喜歡的事情:

let x: Foo; 

但不是:

let x= new Foo(); 

另一種解決方案是隻延長酒吧和作出的空類。這不是真的如何使用類層次結構,但它可以滿足您的需求。

class Foos extends Bar<number> { }