2016-04-22 5 views
39

В чем разница между следующим?В Typcript, в чем разница между типом и интерфейсом?

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, или если вы пишете только функции без использования классов ООП. – 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 реализует Neat, Cool' – Kokodoko

+0

, что означает u? также можно ввести тип b – nadav

0

Типы вроде как интерфейсы и наоборот: оба могут быть реализованы классом. , но есть некоторые важные отличия: 1. Когда Type реализуется классом, свойства, принадлежащие типу, должны быть инициализированы внутри класса, тогда как с интерфейсом они должны быть объявлены. 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' 
} 
Смежные вопросы