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


114

次の違いは何ですか?

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

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

4
ここに利用できるガイダンス:basarat.gitbooks.io/typescript/content/docs/types/...
basarat

2
たとえば、JSONファイルからの外部データや、OOPクラスを使用せずに関数のみを記述している場合は、主にタイプを使用します。
ココドコ2017

1
私は違いを説明しているこの記事が有用であることが判明- medium.com/@martin_hotell/...
サンディープGB

1
受け入れられた回答は古くなっています。ここに投稿された更新された説明(そのスレッドはGoogleに支持されているようです):stackoverflow.com/questions/37233735/…–
jabacchetta

回答:


125

インターフェースは拡張可能

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;

したがって、一般に、質問に示されているように、単純なオブジェクトタイプしかない場合は、通常、インターフェイスの方が優れています。インターフェースとしては書き込めないものを書きたい、または単に別の名前を付けたいだけの場合は、型エイリアスの方が適しています。


3
Type aliases, however, can represent some things interfaces can't私にはあなたの例のようでNeatAndCoolありJustSomeOtherName、既存のNeatCoolまたはSomeTypeタイプを拡張するインターフェースとして作成できます。
Rudey、2017年

確かに第二及び第三の例では、インターフェイスを使用して作成することができる:interface NeatAndCool extends Neat, Cool {} interface JustSomeOtherName extends SomeType {}
peterjwest

3
2つのインターフェースを拡張しても、必ずしも交差タイプと同じ結果が得られるとは限らず、すべてのタイプを拡張できるわけではありません(すべてのタイプをエイリアスまたはユニオン/交差に入れることができます)
Ryan Cavanaugh

1
では、型の利点は何ですか?インターフェースがあるとき、型は役に立たないと言えますか?
モスタファサーダトニア

4

また、インターフェースを実装することもできます。


1
オブジェクトは複数のインターフェースを実装できますclass Thing implements Neat, Cool
ココドコ2017

1
どういう意味ですか ?タイプも実装可能
nadav 2018年

3
これは、回答ではなくコメントにする必要があります。
Michael Kunst

親愛なるデイブ、あなたは答えではなくコメントを残すべきです。また、この回答に基づいてあなたの答えは正確ではありません。
Mehrdad88sh

4

型はインターフェイスのようなもので、その逆も同様です。どちらもクラスで実装できます。ただし、重要な違いがいくつかあります。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'
}

4

これらの違いもすでにこのスレッドにあります。

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

ここtype Foointerface Fooほとんど同じように見えるので、混乱します。

interface以下のプロパティ(ここではfoo:string)がオブジェクトに存在する必要があるという契約です。 interfaceはありませんclass。言語が多重継承をサポートしていない場合に使用されます。したがってinterface、異なるクラス間で共通の構造になる可能性があります。

class Bar implements Foo {
    foo: string;
}

let p: Foo = { foo: 'a string' };

しかし、typeinterfaceは非常に異なるコンテキストで使用されています。

let foo: Foo;
let today: Date = new Date();

ここtypefooあるFootodayされますDate。typeof他の変数の情報を保持する変数declerationのようなものです。 typeインターフェース、クラス、関数シグネチャ、他のタイプ、または値(などtype mood = 'Good' | 'Bad')のスーパーセットのようなものです。最後にtype、可能な変数の構造または値について説明します。


4

タイプも実装できるため、「インターフェースを実装できる」と言うのは間違っています

type A = { a: string };


class Test implements A {

    a: string;
}

これを行うことはできますが、型の和集合である型を実装することはできません。


4

typescriptのtypeは、既存の型を参照するために使用されます。のように拡張することはできませんinterface。以下はその例ですtype

type Money = number;
type FormElem = React.FormEvent<HTMLFormElement>;
type Person = [string, number, number];

タイプでRestとSpreadを使用できます。

type Scores = [string, ...number[]];
let ganeshScore = ["Ganesh", 10, 20, 30]
let binodScore = ["Binod", 10, 20, 30, 40]

一方、インターフェースでは、新しいタイプを作成できます。

interface Person{
  name: string,
  age: number, 
}

Interface can be extended with extends keyword.
interface Todo{
  text: string;
  complete: boolean;
}

type Tags = [string, string, string]

interface TaggedTodo extends Todo{
 tags: Tags
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.