Які відмінності між наведеними нижче?
type Foo = {
foo: string
};
interface Foo {
foo: string;
}
Які відмінності між наведеними нижче?
type Foo = {
foo: string
};
interface Foo {
foo: string;
}
Відповіді:
Інтерфейси можна розширити
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;
Тож загалом, якщо у вас просто тип простого об'єкта, як показано у вашому запитанні, інтерфейс, як правило, є кращим підходом. Якщо ви хочете написати щось, що не можна записати як інтерфейс, або ви хочете просто дати щось інше ім’я, краще псевдонім типу.
Type aliases, however, can represent some things interfaces can'tМені здається, ваші приклади NeatAndCoolі JustSomeOtherNameможе бути створений в якості інтерфейсу , які розширюють існуючі Neat, Coolабо SomeTypeтип.
interface NeatAndCool extends Neat, Cool {} interface JustSomeOtherName extends SomeType {}
Також може бути реалізований інтерфейс .
class Thing implements Neat, Cool
Типи начебто інтерфейсів і навпаки: обидва можуть бути реалізовані класом. але є деякі важливі відмінності: 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'
}
Відмінності між ними теж є в цій темі.
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описується можлива структура або значення змінної.
тип у машинописі використовується для посилання на вже існуючі типи . Його не можна подовжувати як 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
}