У Typescript, яка різниця між типом та інтерфейсом?


114

Які відмінності між наведеними нижче?

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

3
тип не можна розширювати як розширення інтерфейсу. типи - це лише псевдоніми для типу.
ПСЛ

4
Посібники доступні тут: basarat.gitbooks.io/typescript/content/docs/types/…
basarat

2
Я в основному використовую тип для зовнішніх даних, наприклад, з файлу JSON, або якщо ви пишете лише функції без використання класів OOP.
Кокодоко

1
Я вважаю цю статтю корисною, яка пояснює відмінності - medium.com/@martin_hotell/…
Sandeep 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може бути створений в якості інтерфейсу , які розширюють існуючі Neat, Coolабо SomeTypeтип.
Rudey

Дійсно, другий та третій приклади можна створити за допомогою інтерфейсу:interface NeatAndCool extends Neat, Cool {} interface JustSomeOtherName extends SomeType {}
п'ятницю,

3
Розширення двох інтерфейсів не завжди дасть той самий результат, що і тип перетину, і не всі типи можна розширити (тоді як усі типи можна відчужувати або вводити в об'єднання / перехрестя)
Ryan Cavanaugh

1
То в чому перевага типу? Чи можемо ми сказати, коли у нас є інтерфейс, тип не корисний?
Мостафа Сааданія

4

Також може бути реалізований інтерфейс .


1
А об’єкт може реалізувати кілька інтерфейсівclass Thing implements Neat, Cool
Кокодоко

1
що ти маєш на увазі ? також Тип може бути реалізований
надав

3
Це повинен бути коментар, а не відповідь.
Майкл Кунст

Шановний Дейв, ти повинен залишити коментар, а не відповідь. Виходячи з цієї відповіді, ваша відповідь не зовсім правильна.
Mehrdad88sh

4

Типи начебто інтерфейсів і навпаки: обидва можуть бути реалізовані класом. але є деякі важливі відмінності: 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'
}

4

Відмінності між ними теж є в цій темі.

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. Це як декларація змінної, яка містить інформацію про тип інших змінних. type- це як набір інтерфейсів, класів, підпису функції, інших типів або навіть значень (наприклад type mood = 'Good' | 'Bad'). В кінці typeописується можлива структура або значення змінної.


4

Неправильно сказати "Інтерфейси можуть бути реалізовані", оскільки типи також можуть бути реалізовані

type A = { a: string };


class Test implements A {

    a: string;
}

Хоча ви можете це зробити, ви не можете реалізувати тип, який є об'єднанням типів, що має цілком сенс чесно :)


4

тип у машинописі використовується для посилання на вже існуючі типи . Його не можна подовжувати як interface. Приклади type:

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

Ви можете використовувати "Відпочинок" та "Поширення" у типах:

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
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.