2016-04-22 59 views
39

以下幾點有什麼區別?在Typescript中,類型和接口有什麼區別?

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

類型不能像接口擴展那樣擴展。類型只是一個類型的別名。 – PSL

+1

Guidance at here:https://basarat.gitbooks.io/typescript/content/docs/types/type-system.html#type-alias – basarat

+1

我主要使用外部數據的類型,例如來自JSON文件,或者如果你只寫函數而不使用OOP類。 – Kokodoko

回答

58

接口可擴展

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; 

所以一般情況下,如果你只是一個普通的對象類型,如你的問題所示,一個接口通常是一個更好的方法。如果你發現自己想寫一些不能寫成接口的東西,或者想給一些不同的名稱,那麼類型別名會更好。

+2

'然而,類型別名可以表示一些接口無法接口的東西在我看來,您的示例'NeatAndCool'和'JustSomeOtherName'可以創建爲擴展現有的'Neat','Cool'或'SomeType'類型的接口。 –

4

此外,接口可以實現

+0

而一個對象可以實現多個接口'類Thing implements Neat,Cool' – Kokodoko

+0

你是什麼意思? Type也可以實現 – nadav

0

類型有點像接口,反之亦然:兩者都可以通過一個類實現。 但有一些重要的區別: 1.當Type由類實現時,屬於Type的屬性必須在類內初始化,而使用Interface時必須聲明它們。 2. as @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' 
} 
相關問題