2016-04-22 10 views
39

次の違いは何ですか?Typescriptでは、型とインターフェイスの違いは何ですか?

type Foo = { 
    foo: string 
}; 
interface Foo { 
    foo: string; 
} 
+1

タイプは、インターフェイス拡張のように拡張することはできません。型は型の単なるエイリアスです。 – PSL

+1

ガイダンスはこちらから入手できます:https://basarat.gitbooks.io/typescript/content/docs/types/type-system.html#type-alias – basarat

+1

JSONファイルなどの外部データには主にタイプを使用します。 OOPクラスを使用せずに関数を書くだけです。 – Kokodoko

答えて

58

インタフェースは、

interface A { 
    x: number; 
} 
interface B extends A { 
    y: string; 
} 

またを拡張することができる

interface C { 
    m: boolean; 
} 
// ... later ... 
interface C { 
    n: number; 
} 

型の別名を増強しかし、インタフェースは

type NumOrStr = number | string; 
type NeatAndCool = Neat & Cool; 
type JustSomeOtherName = SomeType; 
できないいくつかのものを表すことができ

一般的に、あなたの質問に示されているように単純なオブジェクトタイプを持っているのであれば、インターフェースがより良いアプローチです。インターフェースとして書くことができないものを書こうと思っている場合や、別の名前を付ける場合は、タイプエイリアスが優れています。

+2

'タイプエイリアスはインターフェースができないものを表現することができますあなたの例は' NeatAndCool'と 'JustSomeOtherName'は既存の' Neat'、 'Cool'や' SomeType'タイプを拡張するインターフェースとして作成できます。 –

4

はまた、インターフェースはを実現することができます。

+0

オブジェクトは複数のインターフェースを実装できます 'class Thing implements Neat、Cool' – Kokodoko

+0

どういう意味ですか? Typeは実装可能です – nadav

0

タイプはインターフェースと似ていますが、その逆も同様です。どちらもクラスで実装できます。 しかし重要な違いがいくつかあります: 1. Typeがクラスによって実装されている場合、Typeに属するプロパティはクラス内で初期化されなければなりませんが、Interfaceではそれらを宣言する必要があります。 2. @ryanは述べました:インタフェースは別のインタフェースを拡張することができます。タイプはできません。

type Person = { 
    name:string; 
    age:number; 
} 

// must initialize all props - unlike interface 
class Manager implements Person { 
    name: string = 'John'; 
    age: number = 55; 

    // can add props and methods 
    size:string = 'm'; 
} 

const jane : Person = { 
    name :'Jane', 
    age:46, 

    // cannot add more proprs or methods 
    //size:'s' 
} 
関連する問題