TypeScript 中的类型与接口

news2024/12/26 10:38:00

img

在 TypeScript 中,定义类型有两种方式:“类型”和“接口”。

人们经常想知道该使用哪一种,答案并非适用于所有情况。有时一种更好,但在许多情况下,两者可以互换使用。

我们来详细了解一下类型和接口的不同点和相似点。

类型和类型别名

在 TypeScript 中,我们有一种叫做“类型”的东西,它帮助我们描述我们正在处理的数据类型。这就像为我们的信息提供一个蓝图。

基本类型包括字符串、布尔值、数字、数组、元组和枚举。

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

例如,我们可以为数字创建一个叫做“我的数字”的类型别名,所以我们可以不用写“数字”,只需要说“我的数字”。

我们还可以为用户数据创建一个类型别名,描述一个用户的数据应该是什么样子。

当人们讨论“类型与接口”时,他们实际上是在讨论“类型别名与接口”。这就像给同一组事物起了不同的名称。

TypeScript 中的接口

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

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

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

类型和接口的区别

类型和接口用于定义自定义数据结构和形状,但它们在行为和使用上有一些差异。

原始类型

使用类型:

type MyNumber = number;

在这种情况下,我们创建了一个类型别名 MyNumber,它是 number 原始类型的别名。

使用接口:

你不能使用接口直接定义像 number 这样的原始类型。它们在 TypeScript 中是预定义的。

联合类型

使用类型:

type MyUnionType = number | string;

在这里,我们定义了一个类型 MyUnionType,它可以包含 numberstring 的值。

使用接口:

接口通常不用于直接表示联合类型。你应该使用类型别名来表示这种用途。

函数类型

使用类型:

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

这定义了一个类型 MyFunctionType,用于一个函数,该函数接受两个参数,一个数字和一个字符串,并返回一个布尔值。

使用接口:

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

这个接口 MyFunctionInterface 表示相同的函数类型。

声明合并

使用接口:

interface Person {
  name: string;
}

interface Person {
  age: number;
}

TypeScript 将自动将这两个 Person 接口合并为一个,包含 nameage 的属性。

使用类型:

类型别名不支持声明合并。如果你多次定义相同的类型别名,将导致错误。

扩展 vs. 交叉

使用扩展:

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

接口 B 扩展了接口 A,继承了 propA 属性并添加了新的属性 propB

使用交叉:

type AB = A & { propB: string; }

在这里,我们使用交叉来组合 A 的属性和新属性 propB,以创建类型 AB

扩展时处理冲突

TypeScript 要求扩展时具有相同名称的属性的类型匹配:

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

typescript要解决冲突,你需要确保类型匹配或使用函数的方法重载。

处理元组类型

使用类型:

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

在这里,我们使用 type 定义了一个元组类型,然后我们可以创建该元组类型的变量。

使用接口:

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

你也可以使用接口定义元组类型,使用方式保持不变。

何时使用类型 vs. 接口

当你需要组合或修改现有结构时,使用接口。如果你在处理库或创建新的库,接口是你的首选。

它们允许你合并或扩展声明,使得与现有代码一起工作更加容易。当你以面向对象编程的方式思考时,接口也更易读。

当你需要更强大的功能时,选择类型。TypeScript 的类型系统提供了诸如条件类型、泛型、类型保护等高级工具。

这些功能为你提供了更多控制你的类型的方式,帮助你创建健壮、强类型的应用程序。接口无法提供这些能力。

你通常可以根据个人喜好使用类型或接口。然而,在以下情况下使用类型别名:

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

类型通常更灵活和表达性强。它们提供了一系列接口无法匹敌的高级功能,而 TypeScript 持续扩展其能力。

我们使用类型别名自动生成一个对象类型的 getter 方法,这是你无法通过接口做到的:

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 方法。

此外,许多开发者更喜欢使用类型,因为它们与函数式编程范式很契合。

TypeScript 中类型表达式的丰富性使得在保持类型安全的同时,更容易与函数式概念如组合和不变性一起工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1663292.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

当时这样说就好了的笔记

系列文章目录 当时这样说就好了的笔记 文章目录 系列文章目录一、 不用好口才&#xff0c;怎么谈都讨喜的“说话金律”1、 掌握对方爱聊什么是交谈热络的第一步2、 装笨让对方当主角&#xff0c;和谁都能聊不停3、 “讲道理”谁都怕&#xff0c;坚持己见最伤感情4、 懂“聆听附…

Java——类与对象

目录 一、面向对象的初步认识 1.1 什么是面向对象 1.2 面向对象与面向过程 二、类的定义与使用 2.1 简单认识类 2.2 类的定义格式 三、类的实例化 3.1 什么是实例化 3.2 类和对象的说明 四、this引用 4.1 为什么要有this引用 4.2 什么是this引用 ​编辑 4.3 this引用…

数据增强,迁移学习,Resnet分类实战

目录 1. 数据增强&#xff08;Data Augmentation&#xff09; 2. 迁移学习 3. 模型保存 4. 102种类花分类实战 1. 数据集 2.导入包 3. 数据读取与预处理操作 4. Datasets制作输入数据 5.将标签的名字读出 6.展示原始数据 7.加载models中提供的模型 8.初始化…

轻松操作!ae导出mp4格式,一篇文章学会

在视频制作的过程中&#xff0c;Adobe After Effects作为一款强大而专业的后期处理工具&#xff0c;为我们提供了丰富的特效和编辑功能。然而&#xff0c;在完成创作后&#xff0c;将项目导出为通用的MP4格式是分享和展示作品的关键一步。在本文中&#xff0c;我们将探讨ae导出…

营销的本质是“利他”,资深运营高手分享9套消费返利玩转市场!

营销的本质是“利他”&#xff0c;资深运营高手分享9套消费返利玩转市场&#xff01; 文丨微三云营销总监胡佳东&#xff0c;点击上方“关注”&#xff0c;为你分享市场商业模式电商干货。 - 引言&#xff1a;2024年移动互联网基本已经占据了核心不可篡改的地位&#xff0c;而…

Graphormer:Transformer用于图预测任务

文章信息 文章题为“Do Transformers Really Perform Bad for Graph Representation?”&#xff0c;该文章发表于2021年NeurIPS会议上。文章提出Graphormer图预测任务。 摘要 Transformer架构已经成为许多领域的主导选择&#xff0c;例如自然语言处理和计算机视觉。此外…

1015: 堆排序算法

解法&#xff1a; 20240510_193050 最后一个非叶子节点就是最后一个节点的父节点 进行一次最小堆调整&#xff08;如视频&#xff09; #include<iostream> #include<vector> using namespace std; void min_heapfy(vector<int>& a,int sta,int end) {i…

游戏行业被攻击的原因、攻击种类及合适的服务器

很多游戏刚上线没多久就频繁遭到同行恶意攻击。在相关数据报告中&#xff0c;2023年上半年遭受DDoS攻击的行业中&#xff0c;游戏行业占到40%&#xff0c;而且攻击方式、攻击频率、攻击峰值呈明显上升趋势。很多充满创意的游戏开发公司刚才开发上线一个很有特色的产品&#xff…

在k8s中安装Grafana并对接Prometheus,实现k8s集群监控数据的展示

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Grafana&#xff1a;让数据说话的魔术师》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Grafana简介 2、Grafana的重要性与影响力 …

需求规格说明书设计规范(编制实际项目案例-word)

二、 项目概述 2.1 项目背景 2.2 现状分析 2.2.1 业务现状 2.2.2 系统现状 三、 总体需求 3.1 系统范围 3.2 系统功能 3.3 用户分析 3.4 假设与依赖关系 四、 功能需求 五、 非功能性需求 5.1 用户界面需求 5.2 软硬件环境需求 5.3 产品质量需求 5.4 接口需求 5.5 其他需求 六、…

C语言(指针)2

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

在拥有多个同名称密码的ap环境中,如何连接到指定信道或mac的ap路由器?

在给客户做ESP32-C3入墙开关项目时&#xff0c;客户问&#xff1a;在拥有多个同名称密码的ap环境中&#xff0c;如何连接到指定信道或mac的ap路由器&#xff1f;针对这个问题&#xff0c;启明云端工程师给出下面解决方法。 1、将wifi_sta_config_t配置中的channel配置为该信道…

又一位互联网大佬转行当网红,能写进简历么?

最近半个月&#xff0c;有两个中年男人仿佛住进了热搜。 一个是刚刚辟谣自己“卡里没有冰冷的 40 亿”的雷军&#xff0c;另一个则是在今年年初就高呼“如果有可能&#xff0c;企业家都要去当网红”的 360 创始人周鸿祎。 他也确实做到了。 先是作为当年 3Q 大战的当事人&…

企业破产重整:从“至暗时刻”到“涅槃重生”

今天我们不谈星辰大海&#xff0c;而是要潜入商业世界的深海区&#xff0c;探索那些濒临绝境的企业是如何借助“破产重整”的神秘力量&#xff0c;实现惊天大逆转的&#xff01; 一、破产重整&#xff0c;到底是个啥&#xff1f; 想象一下&#xff0c;企业像是一位远航的船长…

Map按value降序并统计

package com.ldj.cloud.user.demo;import java.util.*;/*** User: ldj* Date: 2024/5/11* Time: 10:03* Description: map按value降序*/ public class Tr {public static void main(String[] args) {ArrayList<String> list new ArrayList<>();list.add("a&q…

在家就可以轻松赚零花钱的副业

互联网的兴起让很多人实现了在家办公的梦想&#xff0c;同时也为人们提供了更多的挣钱方式。以下是4种可以在家中兼职副业赚钱的方法&#xff1a; 1. 写作工作 如果你善于写作&#xff0c;并且有一定的文学素养&#xff0c;那么可以通过自己的博客或其他媒体平台来写作&#…

4. 初探MPI——集体通信

系列文章目录 初探MPI——MPI简介初探MPI——&#xff08;阻塞&#xff09;点对点通信初探MPI——&#xff08;非阻塞&#xff09;点对点通信初探MPI——集体通信 文章目录 系列文章目录前言一、集体通信以及同步点二、MPI_Bcast 广播2.1 使用MPI_Send 和 MPI_Recv 来做广播2.…

【一站式学会Kotlin】第四节默认参数和具名参数、unit返回值类型

作者介绍&#xff1a; 百度资深Android工程师T6&#xff0c;在百度任职7年半。 目前&#xff1a;成立赵小灰代码工作室&#xff0c;欢迎大家找我交流Android、微信小程序、鸿蒙项目。文章底部&#xff0c;csdn有为我插入微信的联络方式&#xff0c;欢迎大家联络我。 一&#x…

按键的短按、长按和连续的划分

在实际生活中&#xff0c;我们使用到的按键在短按、长按和按键松开时都会触发不同的功能。按键短按后松开和长按后松开的应用比短按和长按的应用较少&#xff0c;我了解的按键短按后松开和长按后松开的应用是在点动控制和长动控制中。这里主要讨论按键的短按、长按和连续这三种…

用Xinstall实现智能信息的无缝传递

在这个信息化的时代&#xff0c;智能信息的传递显得尤为重要。无论是对于个人还是企业&#xff0c;高效、准确的信息传递都是成功的关键。然而&#xff0c;随着科技的飞速发展&#xff0c;传统的信息传递方式已经无法满足我们的需求。这时&#xff0c;Xinstall应运而生&#xf…