In Typescript, qual è la differenza tra tipo e interfaccia?


114

Quali sono le differenze tra i seguenti?

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

3
il tipo non può essere esteso come l'estensione dell'interfaccia. i tipi sono solo alias per un tipo.
PSL


2
Uso principalmente il tipo per dati esterni, ad esempio da un file JSON, o se stai solo scrivendo funzioni senza usare classi OOP.
Kokodoko

1
Ho trovato utile questo articolo che spiega le differenze - medium.com/@martin_hotell/…
Sandeep GB

1
La risposta accettata non è aggiornata. Spiegazione aggiornato qui pubblicato (da quel filo sembra essere favorita da Google): stackoverflow.com/questions/37233735/...
jabacchetta

Risposte:


125

Le interfacce possono essere estese

interface A {
  x: number;
}
interface B extends A {
  y: string;
}

e anche aumentato

interface C {
  m: boolean;
}
// ... later ...
interface C {
  n: number;
}

Gli alias di tipo, tuttavia, possono rappresentare alcune cose che le interfacce non possono

type NumOrStr = number | string;
type NeatAndCool = Neat & Cool;
type JustSomeOtherName = SomeType;

Quindi, in generale, se hai solo un semplice tipo di oggetto, come mostrato nella tua domanda, un'interfaccia di solito è un approccio migliore. Se ti accorgi di voler scrivere qualcosa che non può essere scritto come interfaccia, o vuoi semplicemente dare a qualcosa un nome diverso, un alias di tipo è meglio.


3
Type aliases, however, can represent some things interfaces can'tMi sembrano tuoi esempi NeatAndCoole JustSomeOtherNamepossono essere creati come interfaccia che estendono l'esistente Neat, Coolo SomeTypetipi.
Rudey

Infatti il ​​secondo e il terzo esempio possono essere creati con un'interfaccia:interface NeatAndCool extends Neat, Cool {} interface JustSomeOtherName extends SomeType {}
peterjwest

3
L'estensione di due interfacce non produrrà sempre lo stesso risultato di un tipo di intersezione e non tutti i tipi possono essere estesi (mentre tutti i tipi possono essere alias o inseriti in unioni / intersezioni)
Ryan Cavanaugh

1
Allora qual è il vantaggio del tipo? Possiamo dire quando abbiamo l'interfaccia, il tipo non è utile?
Mostafa Saadatnia

4

Inoltre, è possibile implementare un'interfaccia .


1
E un oggetto può implementare più interfacceclass Thing implements Neat, Cool
Kokodoko

1
cosa vuoi dire ? anche il tipo può b implementato
nadav

3
Questo dovrebbe essere un commento non una risposta imo.
Michael Kunst

Caro Dave, dovresti lasciare un commento non una risposta. Anche in base a questa risposta la tua risposta non è esattamente corretta.
Mehrdad88sh

4

I tipi sono un po 'come le interfacce e viceversa: entrambi possono essere implementati da una classe. ma ci sono alcune differenze importanti: 1. quando Type è implementato da una classe, le proprietà che appartengono al Type devono essere inizializzate all'interno della classe, mentre con Interface devono essere dichiarate. 2. come menzionato da @ryan: l'interfaccia può estendere un'altra interfaccia. I tipi non possono.

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

Anche le differenze tra queste sono già in questo thread.

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

Qui type Fooeinterface Foo sembra quasi simile, quindi è confuso.

interfaceè contratto che le seguenti proprietà (qui foo:string) dovrebbero essere presenti in un oggetto. interfacenon lo è class. Viene utilizzato quando la lingua non supporta l'ereditarietà multipla. Quindi interfacepuò essere una struttura comune tra classi diverse.

class Bar implements Foo {
    foo: string;
}

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

Ma typee interfacesono usati in contesti molto diversi.

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

Qui typedi fooè Fooed todayè Date. È come una declinazione variabile che contiene le informazioni del tipo di altra variabile. typeè come un superset di interfacce, classi, firma di funzioni, altri tipi o persino valori (come type mood = 'Good' | 'Bad'). Alla fine typedescrive la possibile struttura o valore di una variabile.


4

È sbagliato dire "Le interfacce possono essere implementate" poiché anche i tipi possono essere implementati

type A = { a: string };


class Test implements A {

    a: string;
}

Sebbene tu possa farlo, non puoi implementare un tipo che sia un'unione di tipi, il che ha assolutamente senso, onestamente :)


4

il tipo nel dattiloscritto viene utilizzato per fare riferimento a tipi già esistenti . Non può essere esteso come interface. Esempi di typesono:

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

puoi usare Riposo e Diffusione nei tipi:

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

L'interfaccia, invece, ti permette di creare un NUOVO TIPO.

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
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.