2017-07-15 2 views
4

すべての文字列であっても、クラスオブジェクトに一意のIDタイプを与えたい。 typeを試してみました。ユニークなサブクラス名を持つ基本クラスから派生させてみました。TypeScriptの基本タイプからユニークなタイプを作成しますか?

次の例を参照してください。 typeでもextendsでも、コンパイラにこれらを一意の型として扱うよう指示することはできません。私はAnimalIdとその逆を期待する関数にHumanIdを引き渡すことができます。

私はオブジェクトに互換性があり、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

うん:あなたは2つだけを区別するようにコンパイラにしたい場合は、あなただけの何のランタイムの違いを確認しないダミーのユニークなメンバーを追加することができます

。言語機能が不足していないことを確認していただきありがとうございます。 'type HumanId = unique string'を宣言できるといいと思う。特定の目的のために使用される基本型のコンパイル時間チェックを利用するためのいくつかの方法。 – Nimai

+0

これは価値があると思いますが、私は可能な限り簡単な一行の構文を使いました。 'class HumanId extends BaseId {humanId}' – Nimai

+0

あなたが望むのは型チェックであれば、おそらくHumanIdとAnimalIdを型として導入することができます.d.ts宣言ファイル? – Kokodoko

関連する問題