7 ответов:
интерфейсы extended
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;Так что в целом, если у вас просто есть простой тип объекта, как показано в вашем вопросе, интерфейс обычно является лучшим подходом. Если вы обнаружите, что хотите написать что-то, что не может быть написано как интерфейс, или хотите просто дать что-то другое имя, a псевдоним типа лучше.
спецификация имеет хорошее обсуждение -https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#3.10
типы-это своего рода интерфейсы и наоборот: оба могут быть реализованы классом. но есть некоторые важные различия: 1. когда тип реализуется классом, свойства, принадлежащие типу, должны быть инициализированы внутри класса, тогда как с интерфейсом они должны быть объявлены. 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' }
различия между ними тоже уже есть в этой теме.
type Foo = { foo: string }; interface Foo { foo: string; }здесь
type Fooиinterface Fooвыглядит почти так же, как его запутать.
interfaceэто контракт, что следующие свойства (здесьfoo:string) должен быть там в объекте.interfaceнеclass. Он используется, когда язык не поддерживает множественное наследование. Так чтоinterfaceможет быть общей структурой между различными классами.class Bar implements Foo { foo: string; } let p: Foo = { foo: 'a string' };но
typeиinterfaceиспользуются в совсем другой контекст.let foo: Foo; let today: Date = new Date();здесь
typeнаfooиFooиtodayиDate. Его как переменная decleration, которая содержит информацию о typeof другой переменной.typeпохоже на надмножество интерфейсов, классов, сигнатур функций, других типов или даже значений (например,type mood = 'Good' | 'Bad'). В конце концовtypeописывает возможную структуру или значение переменной.
неправильно говорить "интерфейсы могут быть реализованы", так как типы также могут быть реализованы
type A = { a: string }; class Test implements A { a: string; }хотя вы можете это сделать, вы не можете реализовать тип, который является объединением типов, что имеет полный смысл честно :)
Правило Буравчика
всегда использовать
interfaceЕсли это возможно. В противном случае играть сtype.смотрите документацию здесь. https://www.typescriptlang.org/docs/handbook/advanced-types.html
Comments