【发布时间】:2017-04-09 18:12:09
【问题描述】:
在 C# 中,接口和类之间存在巨大差异。事实上,一个类代表一个引用类型,因此我们实际上可以创建以该类为模型的对象,而接口意味着一个类签署的契约,以确保特定行为的存在。特别是我们不能创建接口的实例。
接口的全部意义在于暴露行为。一个类通过给出所述行为的一个显式实现来实现它。
在这种情况下,虽然接口可能包含属性,但大多数时候我们关心接口是因为行为问题。所以大多数类型,接口只是行为契约。
另一方面,在 TypeScript 上,我似乎有一些让我很不安的东西,实际上我不止一次看到过这种情况,这就是提出这个问题的原因。
在一个教程中我看到了这个:
export interface User {
name: string; // required with minimum 5 chracters
address?: {
street?: string; // required
postcode?: string;
}
}
但是等一下。为什么User是一个接口?如果我们像 C# 一样思考,User 不应该是一个接口。事实上,看起来我们似乎在定义数据类型User,而不是行为契约。
像我们在 C# 中那样思考,自然会是这样:
export class User {
public name: string;
public address: Address;
}
export class Address {
public street: string;
public postcode: string;
}
但是,像我们使用类一样使用接口来定义数据类型,而不是定义行为契约,这在 TypeScript 中似乎很常见。
那么 TypeScript 中的接口是什么意思?为什么人们在 TypeScript 中使用接口,就像我们在 C# 中使用类一样?在 TypeScript 中应该如何正确使用接口:建立行为契约,或者定义属性和对象应该具有的?
【问题讨论】:
-
很少来自 C# 的内容适用于 TypeScript,因为后者是 structurally typed。此外,拥有某些属性绝对可以被视为一种行为:-)
-
我不知道你期待什么样的答案。你不能像那样比较语言。
-
我认为引用 C# 是错误的。我不想比较语言,也不想比较任何东西。我刚刚谈到 C# 作为我习惯使用的接口的一个例子。我想知道的是我们什么时候应该在 TypeScript 中使用接口或类,因为人们似乎将它们都用于相同的目的,而不是为它们每个都有一个特定的目的。正如我所说,同样可以使用类和接口来完成,而且我似乎有人在做这两种方式,这让我感到困惑。问题是只是关于打字稿,C# 只是一个例子。
-
好的,但是 TypeScript 中的接口用于类似目的。并且您不能互换使用 then 。例如,你不能在给定接口
IUser的情况下使用new IUser(),所以从我的角度来看,如果你能更具体地说明什么让你感到困惑,那就太好了。是“嵌套内联”接口还是可选属性?
标签: javascript typescript interface