2017-01-16 79 views
4

中的類型(vs接口)我無法確定何時,如果您想要使用type而不是interface作爲打字稿中的變量。假設有以下兩種:何時使用TS

type User = { 
    id: string; 
    name: string; 
    type: string; 
} 

interface User { 
    id: string; 
    name: string; 
    type: string; 
} 

我可以定義與兩個完全相同的是const user: User = ...的變量。但是,這裏有所有的事情我可以做interface,我不能做types

// Extension: 
interface AdminUser extends User { 
    permissions: string[]; 
    role: string; 
} 

// Using in abstract method: 
abstract class Home { 
    abstract login(user: User): void; 
} 

class AdminHome extends Home { 
    login(user: AdminUser) { 
     ... 
    } 
} 

只是僅舉幾例。

所以我的問題是:你什麼時候想要使用type

回答

11

除非我弄錯了,否則你不完全清楚接口與類型的目的是什麼。

在OOP術語中,接口沒有實現。類型可以。所以一個接口基本上是無用的,除非一個類型實現它。另外,一個類型只能擴展一個其他類型。但它可以實現許多接口。

但是這是什麼意思...

假設你有一輛汽車和一個用戶。非常不同的類型,你不會立即想到在任何實際的方式是相同的。有人會說,「好吧,你應該創造ICar和IUser」。但是,真的,這不是考慮接口的實際方法。用戶實施ICar會讓人感到困惑,並且/或者ICar似乎與Car做同樣的事情。另一位程序員在查看代碼時會有什麼不同?

假設你希望它們都是(再次只是爲了它),「自我描述」,並且你希望它們都以同樣的方式提供信息。所以,你會創建:

ISelfDescribable { 
    getSelfDescription (); 
} 

現在,你可以這樣做:

Car implements ISelfDescribable { 
    getSelfDescription (return "I am a car!"); 
} 

User implements ISelfDescribable { 
    getSelfDescription (return ...some other completely different way of getting the info...); 
} 

這些對象的數組將是(想想你會做這是怎麼回事無接口):

Array<ISelfDescribable> 

現在你(和任何其他開發者在看代碼)知道一個事實,不管具體類型如何,這個數組中的任何對象都實現了ISelfDesribable的「行爲」。如果你仔細想想,除非你正在實施它,否則真的不需要知道類型是什麼,你只關心行爲。但是你仍然需要這種類型來實現這種行爲。

說一天,你希望這兩個對象都是「保證」。他們都應該有一個方法,"setInsurancePolicy"。你可以創建IInsurable { setInsurancePolicy (policy : Policy) },並在類型中實現它。現在您的對象既是ISelfDescribable也是IInsurable,並且可以將這些對象的數組作爲任意一個鍵入。

因此,對於我來說,當我頭腦發熱時,大燈泡熄滅:類型(和類型層次結構)應該關注具體的事情。接口應該關注可以在不同類型之間共享的行爲。還有更多,但至少給出了你爲什麼選擇接口或類型的概念。它們在編程方面代表不同的事物,即使它們看起來是相同的。(附錄:像Scala這樣的語言沒有用這種方式來思考界面,他們有一個「行爲」的概念,但是你也可以實現行爲並覆蓋它們。這個特別的問題,但是嘿,我需要殺死地牢裏的所有怪物,而不僅僅是那些任務)。

相關問題