2017-01-16 80 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这样的语言没有用这种方式来思考界面,他们有一个“行为”的概念,但是你也可以实现行为并覆盖它们。这个特别的问题,但是嘿,我需要杀死地牢里的所有怪物,而不仅仅是那些任务)。

相关问题