2017-07-15 69 views
4

我想給類對象提供唯一的id類型,即使它們都是字符串。我嘗試使用type,我嘗試從具有唯一子類名稱的基類派生。在TypeScript中創建基本類型的唯一類型?

請看下面的例子。 typeextends都不允許我指示編譯器將它們視爲唯一類型。我仍然可以將HumanId傳遞給期望AnimalId的函數,反之亦然。

我知道它們是對象兼容的,而且從底層的JavaScript角度來看,這是非常重要的。事實上,如果我的唯一成員添加到AnimalId,我得到的錯誤我想到:

Argument of type 'HumanId' is not assignable to parameter of type 'AnimalId'.

是否與打字稿一個很好的方法,使獨特類型的別名基本類型?

// type HumanId = string; 
// type AnimalId = string; 

class id { 
    constructor(public value: string) { } 
    toString(): string { return this.value;} 
} 
class HumanId extends id { }; 
class AnimalId extends id { }; 

function humanTest(id: HumanId): void { 

} 

function animalTest(id: AnimalId): void { 

} 

let h: HumanId = new HumanId("1"); 
let a: AnimalId = new AnimalId("2"); 

animalTest(h); 

回答

1

正如您所提到的,這些類型在結構上是兼容的。讓他們獨一無二的唯一方法是爲他們添加獨特的屬性。

如果你只想編譯器區分這兩者,你可以添加虛擬的唯一成員,這使得沒有運行時的區別:

class HumanId extends id { 
    private _humanId: HumanId; // Could be anything as long as it is unique from the other class 
} 
class AnimalId extends id { 
    private _animalId: AnimalId; 
} 
+0

是啊。感謝您確認我不缺少語言功能。我認爲能夠聲明'type HumanId = unique string'會很好。利用編譯時檢查基本類型以用於特定目的的一些方法。 – Nimai

+0

爲了什麼是值得的,我使用了最簡單的單行語法,並且做到了:'class HumanId extends BaseId {humanId}' – Nimai

+0

如果你想要的只是類型檢查,也許你可以引入HumanId和AnimalId作爲類型.d.ts聲明文件? – Kokodoko