在 TypeScript 中,定义类型有两种方式:“类型”和“接口”。 人们经常想知道该使用哪一种,答案并非适用于所有情况。有时一种更好,但在许多情况下,两者可以互换使用。 我们来详细了解一下类型和接口的不同点和相似点。 类型和类型别名在 TypeScript 中,我们有一种叫做“类型”的东西,它帮助我们描述我们正在处理的数据类型。这就像为我们的信息提供一个蓝图。 基本类型包括字符串、布尔值、数字、数组、元组和枚举。 但是,还有更多!我们还有“类型别名”。可以把它们想象成类型的昵称。我们不是在创建新类型;我们只是给它们起了更友好的名称。这使我们的代码更容易阅读和理解。 例如,我们可以为数字创建一个叫做“我的数字”的类型别名,所以我们可以不用写“数字”,只需要说“我的数字”。 我们还可以为用户数据创建一个类型别名,描述一个用户的数据应该是什么样子。 当人们讨论“类型与接口”时,他们实际上是在讨论“类型别名与接口”。这就像给同一组事物起了不同的名称。 TypeScript 中的接口在 TypeScript 中,可以将接口视为一个对象必须遵循的规则或要求集合。这就像一份合约,说:“嘿,如果你想成为'客户’,你必须有'名称’和'地址’。” 现在,还有另一种表达这些规则的方法。你可以使用所谓的“类型注解”。这有点像说,“这里是'客户’应该长什么样子”,然后列出'名称’和'地址’属性及其类型,就像你在接口中所做的那样。 所以,无论你使用接口还是类型注解,你本质上都在定义同样的期望集合,对于'客户’应该是什么样子。这就像给同一组指令起了两个不同的名字。 类型和接口的区别类型和接口用于定义自定义数据结构和形状,但它们在行为和使用上有一些差异。 原始类型使用类型:
在这种情况下,我们创建了一个类型别名 使用接口: 你不能使用接口直接定义像 联合类型使用类型:
在这里,我们定义了一个类型 使用接口: 接口通常不用于直接表示联合类型。你应该使用类型别名来表示这种用途。 函数类型使用类型:
这定义了一个类型 使用接口:
这个接口 声明合并使用接口:
TypeScript 将自动将这两个 使用类型: 类型别名不支持声明合并。如果你多次定义相同的类型别名,将导致错误。 扩展 vs. 交叉使用扩展:
接口 使用交叉:
在这里,我们使用交叉来组合 扩展时处理冲突TypeScript 要求扩展时具有相同名称的属性的类型匹配:
typescript要解决冲突,你需要确保类型匹配或使用函数的方法重载。 处理元组类型使用类型:
在这里,我们使用 使用接口:
你也可以使用接口定义元组类型,使用方式保持不变。 何时使用类型 vs. 接口当你需要组合或修改现有结构时,使用接口。如果你在处理库或创建新的库,接口是你的首选。 它们允许你合并或扩展声明,使得与现有代码一起工作更加容易。当你以面向对象编程的方式思考时,接口也更易读。 当你需要更强大的功能时,选择类型。TypeScript 的类型系统提供了诸如条件类型、泛型、类型保护等高级工具。 这些功能为你提供了更多控制你的类型的方式,帮助你创建健壮、强类型的应用程序。接口无法提供这些能力。 你通常可以根据个人喜好使用类型或接口。然而,在以下情况下使用类型别名:
类型通常更灵活和表达性强。它们提供了一系列接口无法匹敌的高级功能,而 TypeScript 持续扩展其能力。 我们使用类型别名自动生成一个对象类型的 getter 方法,这是你无法通过接口做到的:
通过使用映射类型、模板文字和'keyof’操作符,我们创建了一个类型,它可以为任何对象类型自动生成 getter 方法。 此外,许多开发者更喜欢使用类型,因为它们与函数式编程范式很契合。 TypeScript 中类型表达式的丰富性使得在保持类型安全的同时,更容易与函数式概念如组合和不变性一起工作。 |
|