2017-01-16 10 views
4

で使用する場合、タイプスクリプト内の変数にinterfaceの代わりにtypeを使用する場合はいつでもわかりません。次の二つを想定しますタイプ(vsインターフェイス)をTS

type User = { 
    id: string; 
    name: string; 
    type: string; 
} 

interface User { 
    id: string; 
    name: string; 
    type: string; 
} 

私はまったく同じでconst user: User = ...だったの両方で変数を定義することができます。しかし、ここで私がtypesを行うことができない私はinterfaceで行うことができますすべてのものです:

// Extension: 
interface AdminUser extends User { 
    permissions: string[]; 
    role: string; 
} 

// Using in abstract method: 
abstract class Home { 
    abstract login(user: User): void; 
} 

class AdminHome extends Home { 
    login(user: AdminUser) { 
     ... 
    } 
} 

ほんの数に名前を付けます。

私の質問は次のとおりです。typeをいつ使用したいですか?

答えて

11

私が間違っていない限り、インターフェイスの目的がどのようなものなのか完全にはっきりしていません。

OOPでは、インターフェイスには実装がありません。タイプは行います。したがって、インタフェースは、型がそれを実装しない限り、基本的に役に立たない。また、1つの型は他の1つの型だけを拡張できます。しかし、多くのインターフェースを実装することができます。

しかし、それは何を意味するのだ...

あなたは車、およびユーザーを持っていると言います。どのような実用的な方法でも同じであるとすぐには考えられない非常に異なるタイプです。 「ICarとIUserを作成する必要があります」と言う人もいます。しかし実際には、それはインタフェースについて考える実践的な方法ではありません。ユーザーがICarを実装するのは紛らわしく、ICarはCarと同じことをするようです。コードを見ている別のプログラマーとの違いは何でしょうか?

「自己記述可能」であることと、両方の情報を同じ方法で提供したいと思うとします。だから、あなたが作成したい:

Car implements ISelfDescribable { 
    getSelfDescription (return "I am a car!"); 
} 

User implements ISelfDescribable { 
    getSelfDescription (return ...some other completely different way of getting the info...); 
} 

これらのオブジェクトの配列は、(あなたはインタフェースなしでこれを行うだろうどのように他を考える)、次のようになります:

ISelfDescribable { 
    getSelfDescription (); 
} 

を、あなたはこれを行うだろう

ここでは、具体的な型に関係なく、この配列内のオブジェクトがISelfDesribableの「ビヘイビア」を実装するという事実を知っています。あなたがそれについて考えているなら、あなたがそれを実装していない限り、タイプが何であるかを知る必要は本当にありません。しかし、その振る舞いを実装するには型はまだ必要です。

これらのオブジェクトの両方が「Insurable」であることを望んだとします。彼らはどちらもメソッド、"setInsurancePolicy"を持っている必要があります。 IInsurable { setInsurancePolicy (policy : Policy) }を作成し、そのタイプで実装することができます。これでオブジェクトはISelfDescribableIInsurableになりました。これらのオブジェクトの配列をどちらかとして入力できます。

私にとっては、大きな電球が私の周りに頭を抱えていたときに消えました:タイプ(およびタイプ階層)は具体的な事柄に関係するべきです。インタフェースは、異なるタイプ間で共有できるビヘイビアに関係している必要があります。これ以上のことはありますが、少なくともインターフェースやタイプを選択する理由についての考え方は少なくありません。たとえそうでなければ同じように見えても、それらはプログラミングの点で異なることを表しています。

(補足:Scalaのような言語は、このようにインターフェースに関しては考えませんが、 "behaviors"という概念はありますが、動作を実装してオーバーライドすることもできます。この特別な質問ですが、私はダンジョンのすべてのモンスターを殺す必要があります、クエストのものだけではありません)。

関連する問題