当前位置:首页 > 科技  > 软件

TypeScript 中的类型与接口

来源: 责编: 时间:2024-05-16 09:10:36 80观看
导读在 TypeScript 中,定义类型有两种方式:“类型”和“接口”。人们经常想知道该使用哪一种,答案并非适用于所有情况。有时一种更好,但在许多情况下,两者可以互换使用。我们来详细了解一下类型和接口的不同点和相似点。类型和

在 TypeScript 中,定义类型有两种方式:“类型”和“接口”。lKk28资讯网——每日最新资讯28at.com

人们经常想知道该使用哪一种,答案并非适用于所有情况。有时一种更好,但在许多情况下,两者可以互换使用。lKk28资讯网——每日最新资讯28at.com

我们来详细了解一下类型和接口的不同点和相似点。lKk28资讯网——每日最新资讯28at.com

类型和类型别名

在 TypeScript 中,我们有一种叫做“类型”的东西,它帮助我们描述我们正在处理的数据类型。这就像为我们的信息提供一个蓝图。lKk28资讯网——每日最新资讯28at.com

基本类型包括字符串、布尔值、数字、数组、元组和枚举。lKk28资讯网——每日最新资讯28at.com

但是,还有更多!我们还有“类型别名”。可以把它们想象成类型的昵称。我们不是在创建新类型;我们只是给它们起了更友好的名称。这使我们的代码更容易阅读和理解。lKk28资讯网——每日最新资讯28at.com

例如,我们可以为数字创建一个叫做“我的数字”的类型别名,所以我们可以不用写“数字”,只需要说“我的数字”。lKk28资讯网——每日最新资讯28at.com

我们还可以为用户数据创建一个类型别名,描述一个用户的数据应该是什么样子。lKk28资讯网——每日最新资讯28at.com

当人们讨论“类型与接口”时,他们实际上是在讨论“类型别名与接口”。这就像给同一组事物起了不同的名称。lKk28资讯网——每日最新资讯28at.com

TypeScript 中的接口

在 TypeScript 中,可以将接口视为一个对象必须遵循的规则或要求集合。这就像一份合约,说:“嘿,如果你想成为‘客户’,你必须有‘名称’和‘地址’。”lKk28资讯网——每日最新资讯28at.com

现在,还有另一种表达这些规则的方法。你可以使用所谓的“类型注解”。这有点像说,“这里是‘客户’应该长什么样子”,然后列出‘名称’和‘地址’属性及其类型,就像你在接口中所做的那样。lKk28资讯网——每日最新资讯28at.com

所以,无论你使用接口还是类型注解,你本质上都在定义同样的期望集合,对于‘客户’应该是什么样子。这就像给同一组指令起了两个不同的名字。lKk28资讯网——每日最新资讯28at.com

类型和接口的区别

类型和接口用于定义自定义数据结构和形状,但它们在行为和使用上有一些差异。lKk28资讯网——每日最新资讯28at.com

原始类型

使用类型:lKk28资讯网——每日最新资讯28at.com

type MyNumber = number;

在这种情况下,我们创建了一个类型别名 MyNumber,它是 number 原始类型的别名。lKk28资讯网——每日最新资讯28at.com

使用接口:lKk28资讯网——每日最新资讯28at.com

你不能使用接口直接定义像 number 这样的原始类型。它们在 TypeScript 中是预定义的。lKk28资讯网——每日最新资讯28at.com

联合类型

使用类型:lKk28资讯网——每日最新资讯28at.com

type MyUnionType = number | string;

在这里,我们定义了一个类型 MyUnionType,它可以包含 number 或 string 的值。lKk28资讯网——每日最新资讯28at.com

使用接口:lKk28资讯网——每日最新资讯28at.com

接口通常不用于直接表示联合类型。你应该使用类型别名来表示这种用途。lKk28资讯网——每日最新资讯28at.com

函数类型

使用类型:lKk28资讯网——每日最新资讯28at.com

type MyFunctionType = (arg1: number, arg2: string) => boolean;

这定义了一个类型 MyFunctionType,用于一个函数,该函数接受两个参数,一个数字和一个字符串,并返回一个布尔值。lKk28资讯网——每日最新资讯28at.com

使用接口:lKk28资讯网——每日最新资讯28at.com

interface MyFunctionInterface {  (arg1: number, arg2: string): boolean;}

这个接口 MyFunctionInterface 表示相同的函数类型。lKk28资讯网——每日最新资讯28at.com

声明合并

使用接口:lKk28资讯网——每日最新资讯28at.com

interface Person {  name: string;}interface Person {  age: number;}

TypeScript 将自动将这两个 Person 接口合并为一个,包含 name 和 age 的属性。lKk28资讯网——每日最新资讯28at.com

使用类型:lKk28资讯网——每日最新资讯28at.com

类型别名不支持声明合并。如果你多次定义相同的类型别名,将导致错误。lKk28资讯网——每日最新资讯28at.com

扩展 vs. 交叉

使用扩展:lKk28资讯网——每日最新资讯28at.com

interface A { propA: number; }interface B extends A { propB: string; }

接口 B 扩展了接口 A,继承了 propA 属性并添加了新的属性 propB。lKk28资讯网——每日最新资讯28at.com

使用交叉:lKk28资讯网——每日最新资讯28at.com

type AB = A & { propB: string; }

在这里,我们使用交叉来组合 A 的属性和新属性 propB,以创建类型 AB。lKk28资讯网——每日最新资讯28at.com

扩展时处理冲突

TypeScript 要求扩展时具有相同名称的属性的类型匹配:lKk28资讯网——每日最新资讯28at.com

interface A { commonProp: number; }interface B { commonProp: string; }interface AB extends A, B { }// 错误: A 和 B 中的 'commonProp' 属性必须具有相同的类型

typescript要解决冲突,你需要确保类型匹配或使用函数的方法重载。lKk28资讯网——每日最新资讯28at.com

处理元组类型

使用类型:lKk28资讯网——每日最新资讯28at.com

type MyTupleType = [number, string];const tuple: MyTupleType = [42, "hello"];

在这里,我们使用 type 定义了一个元组类型,然后我们可以创建该元组类型的变量。lKk28资讯网——每日最新资讯28at.com

使用接口:lKk28资讯网——每日最新资讯28at.com

interface MyTupleInterface {  0: number;  1: string;}const tuple: MyTupleInterface = [42, "hello"];

你也可以使用接口定义元组类型,使用方式保持不变。lKk28资讯网——每日最新资讯28at.com

何时使用类型 vs. 接口

当你需要组合或修改现有结构时,使用接口。如果你在处理库或创建新的库,接口是你的首选。lKk28资讯网——每日最新资讯28at.com

它们允许你合并或扩展声明,使得与现有代码一起工作更加容易。当你以面向对象编程的方式思考时,接口也更易读。lKk28资讯网——每日最新资讯28at.com

当你需要更强大的功能时,选择类型。TypeScript 的类型系统提供了诸如条件类型、泛型、类型保护等高级工具。lKk28资讯网——每日最新资讯28at.com

这些功能为你提供了更多控制你的类型的方式,帮助你创建健壮、强类型的应用程序。接口无法提供这些能力。lKk28资讯网——每日最新资讯28at.com

你通常可以根据个人喜好使用类型或接口。然而,在以下情况下使用类型别名:lKk28资讯网——每日最新资讯28at.com

  • • 当你想为基本数据类型(如‘字符串’或‘数字’)创建一个新名称时。
  • • 当定义更复杂的类型如联合、元组或函数时。
  • • 当重载函数时。
  • • 当使用高级功能如映射类型、条件类型或类型保护时。

类型通常更灵活和表达性强。它们提供了一系列接口无法匹敌的高级功能,而 TypeScript 持续扩展其能力。lKk28资讯网——每日最新资讯28at.com

我们使用类型别名自动生成一个对象类型的 getter 方法,这是你无法通过接口做到的:lKk28资讯网——每日最新资讯28at.com

type Client = {    name: string;    address: string;}type Getters<T> = {    [K in keyof T as `get${Capitalize<string & K>}`]: () => T[K];};type clientType = Getters<Client>;// 结果是: // {//     getName: () => string;//     getAddress: () => string;// }

通过使用映射类型、模板文字和‘keyof’操作符,我们创建了一个类型,它可以为任何对象类型自动生成 getter 方法。lKk28资讯网——每日最新资讯28at.com

此外,许多开发者更喜欢使用类型,因为它们与函数式编程范式很契合。lKk28资讯网——每日最新资讯28at.com

TypeScript 中类型表达式的丰富性使得在保持类型安全的同时,更容易与函数式概念如组合和不变性一起工作。lKk28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-88396-0.htmlTypeScript 中的类型与接口

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 聊聊主流的Kafka监控框架

下一篇: React 全新编译器太好用了!

标签:
  • 热门焦点
  • 小米降噪蓝牙耳机Necklace分享:听一首歌 读懂一个故事

    小米降噪蓝牙耳机Necklace分享:听一首歌 读懂一个故事

    在今天下午的小米Civi 2新品发布会上,小米还带来了一款新的降噪蓝牙耳机Necklace,我们也在发布结束的第一时间给大家带来这款耳机的简单分享。现在大家能见到最多的蓝牙耳机
  • Redmi Buds 4开箱简评:才199还有降噪 可以无脑入

    Redmi Buds 4开箱简评:才199还有降噪 可以无脑入

    在上个月举办的Redmi Note11T Pro系列新机发布会上,除了两款手机新品之外,Redmi还带来了两款TWS真无线蓝牙耳机产品,Redmi Buds 4和Redmi Buds 4 Pro,此前我们在Redmi Note11T
  • Flowable工作流引擎的科普与实践

    Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 十个简单但很有用的Python装饰器

    十个简单但很有用的Python装饰器

    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用
  • 三言两语说透柯里化和反柯里化

    三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • 一文搞定Java NIO,以及各种奇葩流

    一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • 为什么你不应该使用Div作为可点击元素

    为什么你不应该使用Div作为可点击元素

    按钮是为任何网络应用程序提供交互性的最常见方式。但我们经常倾向于使用其他HTML元素,如 div span 等作为 clickable 元素。但通过这样做,我们错过了许多内置浏览器的功能。
  • 本地生活这块肥肉,拼多多也想吃一口

    本地生活这块肥肉,拼多多也想吃一口

    出品/壹览商业 作者/李彦编辑/木鱼拼多多也看上本地生活这块蛋糕了。近期,拼多多在App首页&ldquo;充值中心&rdquo;入口上线了本机生活界面。壹览商业发现,该界面目前主要
  • 苹果140W USB-C充电器:采用氮化镓技术

    苹果140W USB-C充电器:采用氮化镓技术

    据10 月 30 日 9to5 Mac 消息报道,当苹果推出新的 MacBook Pro 2021 时,该公司还推出了新的 140W USB-C 充电器,附赠在 MacBook Pro 16 英寸机型的盒子里,也支
Top