2016-04-22 18 views
39

Quali sono le differenze tra quanto segue?In Typescript, qual è la differenza tra tipo e interfaccia?

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

tipo non può essere esteso come estensione di interfaccia. i tipi sono solo alias per un tipo. – PSL

+1

Guida disponibile qui: https://basarat.gitbooks.io/typescript/content/docs/types/type-system.html#type-alias – basarat

+1

Per lo più uso il tipo per dati esterni, ad esempio da un file JSON, o se stai solo scrivendo funzioni senza utilizzare le classi OOP. – Kokodoko

risposta

58

interfacce possono essere estese

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

e anche augmented

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

alias tipo, tuttavia, può rappresentare alcune cose interfacce non possono

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

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

+2

'Gli alias di tipo, tuttavia, possono rappresentare alcune cose che le interfacce non possono' Sembra che i tuoi esempi 'NeatAndCool' e' JustSomeOtherName' possano essere creati come interfaccia che estendono i tipi 'Neat',' Cool' o 'SomeType' esistenti . –

4

Inoltre, un'interfaccia può essere implementato .

+0

E un oggetto può implementare più interfacce 'classe Thing implements Neat, Cool' – Kokodoko

+0

cosa intendi? anche Type può essere implementato – nadav

0

I tipi sono come le interfacce e viceversa: entrambi possono essere implementati da una classe. ma ci sono alcune importanti differenze: 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 @ryan menzionato: 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' 
} 
Problemi correlati