WHAT - Typescript 中 structural-type-system 结构类型系统

目录

  • 一、结构类型系统与名义类型系统
  • 二、结构类型系统的基本概念
  • 三、泛型和结构类型系统
  • 四、类型别名和接口的兼容性
  • 五、总结

一、结构类型系统与名义类型系统

TypeScript 中的结构类型系统(Structural Type System)是 TypeScript 的核心特性之一,它与传统的名义类型系统(Nominal Type System)不同,主要通过**类型的形状(structure)**来进行类型检查,而不是通过类型的名称(name)。

在结构类型系统中,如果两个类型具有相同的形状,即使它们的名字不同,编译器也会认为它们是兼容的。具体来说,只要一个对象具有所需的属性和方法,它就可以被认为是符合特定类型的。

二、结构类型系统的基本概念

  1. 鸭子类型(Duck Typing)

    • “如果它走路像鸭子,叫声像鸭子,那么它就是鸭子。”这句话很好地描述了 TypeScript 的类型系统。如果一个对象具有特定类型的所有属性和方法,那么这个对象就被认为是这种类型。
  2. 兼容性

    • TypeScript 检查两个类型是否兼容,不是通过类型名,而是通过它们的结构。这意味着只要一个类型的属性和方法是另一个类型的子集,那么这两个类型就是兼容的。

示例:

interface Person {name: string;age: number;
}
function greet(person: Person) {console.log(`Hello, ${person.name}`);
}const john = { name: "John", age: 25 };
const jane = { name: "Jane", age: 30, address: "123 Main St" };greet(john);  // 正常运行
greet(jane);  // 也正常运行,因为 jane 拥有 name 和 age 属性

在上面的例子中,greet 函数要求一个 Person 类型的参数。虽然 jane 对象有一个额外的 address 属性,但它仍然具有 nameage 属性,因此它被认为是兼容的。

三、泛型和结构类型系统

结构类型系统在处理泛型时也非常有用,因为它允许在不显式声明类型的情况下推断类型。

function logIdentity<T>(arg: T): T {console.log(arg);return arg;
}logIdentity("Hello");
logIdentity(42);
logIdentity({ name: "Alice", age: 28 });

在这个例子中,logIdentity 函数可以接受任何类型的参数,并返回相同类型的值。TypeScript 会根据传入的参数推断出具体类型。

四、类型别名和接口的兼容性

type Car = {make: string;model: string;
};
interface Vehicle {make: string;model: string;
}let myCar: Car = { make: "Toyota", model: "Camry" };
let myVehicle: Vehicle = myCar;  // 兼容,因为它们的结构相同

在这个例子中,尽管 CarVehicle 的名称不同,但由于它们具有相同的结构,它们是兼容的。

五、总结

TypeScript 的结构类型系统通过类型的形状进行类型检查,使得类型检查更加灵活和强大。这种方式不仅提高了代码的可维护性和可读性,还减少了不必要的类型声明,促进了代码的重用和抽象。

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

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

相关文章

解决uniapp里的onNavigationBarSearchInputClicked不生效

如何在uniapp里使用onNavigationBarSearchInputClicked。 1、在page.json里配置 "pages": [{"path": "pages/index/index","style": {"navigationBarTitleText": "首页","navigationStyle": "cu…

【Android】手动下载gradle插件包,解决gradle插件包下载不全问题。

问题描述 拉取别人的项目时&#xff0c;因为网络问题gradle插件包一直下载不全&#xff0c;一直build。 解决方案&#xff1a; 打开gradle>wrapper文件下gradle-wrapper.properties&#xff0c;查看需要下载gradle-7.2-bin.zip。 distributionBaseGRADLE_USER_HOME distr…

cmd窗口输出内容乱码问题

出现这样的问题是因为编码格式和解码格式不一样导致的&#xff0c;cmd窗口的默认解码格式为GBK&#xff0c;如想修改cmd默认编码格式可以按照下面步骤操作&#xff1a;打开cmd窗口输入&#xff1a;chcp 65001 65001指的是utf-8编码如果不清楚编码对应的 页面编码是是多少&#…

国内外知名的低代码开发平台下载地址

以下是国内外几款低代码开发平台的列表&#xff0c;包含了下载地址、适应操作系统、是否可以独立部署、优点、缺点以及是否包含流程引擎的信息。 平台名称 下载地址 适应操作系统 是否可以独立部署 优点 缺点 是否包含流程引擎 国内平台 阿里云宜搭 阿里云官网 跨平台…

文件批量重新命名

实用 如果你想忽略原文件的后缀&#xff0c;将所有文件&#xff08;除了 .py 文件&#xff09;都重命名为以 .jpg 结尾&#xff0c;并且使用序号来命名&#xff0c;你可以使用以下脚本&#xff1a; # renamefile.py import os# 定义原始目录和起始序号 original_directory &q…

C++操纵符用法

C中的操纵符&#xff08;Manipulators&#xff09;是用于格式化输入输出的特殊工具。它们可以在输出流中控制各种格式&#xff0c;如设置字段宽度、精度、填充字符等。以下是一些常用的操纵符及其用法&#xff1a; setw(int width): 设置字段宽度为width个字符。 cout <<…

访问github加速方法续集dev-sidecar

访问github加速方法续集dev-sidecar dev-sidecar 重要提醒 ------------------------------重要提醒1--------------------------------- 注意&#xff1a;由于electron无法监听windows的关机事件&#xff0c;开着ds情况下直接重启电脑&#xff0c;会导致无法上网&#xff0c…

【网络层】IP地址基础 与 子网掩码

文章目录 IP地址基础IP地址概念IP地址分类公网地址和私网地址 子网掩码子网掩码作用默认子网掩码网络地址、主机地址、广播地址 IP地址基础 IP地址概念 IP地址&#xff1a;IP Address 在网络中&#xff0c;通信节点都需要有一个IP地址 IP地址以点分十进制表示&#xff0c;有…

建设人工智能平台,主流GPU卡选型分析

国内外主流GPU卡性能分析&#xff01;2024&#xff01; 大模型兴起助推算力需求激增 2024年&#xff0c;深度学习与人工智能技术飞速跃进&#xff0c;Transformer、GPT-3等大模型在自然语言处理、图像识别、语音合成等领域大放异彩&#xff0c;开启AI新纪元。其庞大的参数与数…

Matlab操作Excel筛选指定数据的对应数据

Matlab中在表格中寻找指定汉字&#xff0c;并返回其所在行数&#xff0c; 将该行数的另一列提取出来。 目录 一、前言 二、直接在命令行输出 三、保存筛选数据excel 一、前言 源数据excel&#xff1a; 指定汉子&#xff1a;买&#xff0c;得到下面数据&#xff1a; 二、直接…

微信小程序埋点监听方案

场景&#xff1a;运营小程序&#xff0c;需要根据系统访问情况来做决策时。 后台&#xff1a;开发可配置监听页面路径&#xff0c;参数&#xff0c;事件名称等&#xff0c;类似以下格式&#xff0c;进行json保存。 组装数据接口返回给前端缓存到本地&#xff0c;然后进行校验编…

2024华为OD机试真题-机器人搬砖-C++(C卷D卷)

题目描述 机器人搬砖,一共有N堆砖存放在N个不同的仓库中,第i堆砖中有bricks[i]块砖头, 要求在8小时内搬完。机器人每小时能搬砖的数量取决于有多少能量格, 机器人一个小时中只能在一个仓库中搬砖,机器人的能量格每小时补充一次且能量格只在这一个小时有效,为使得机器人损…

Vue3 自定义Hooks函数的封装

1、如何理解vue3中的自定义hooks 在Vue 3中&#xff0c;自定义hooks允许开发者封装和重用逻辑代码。自定义hooks是使用Composition API时创建的函数&#xff0c;这些函数可以包含任意的组合逻辑&#xff0c;并且可以在多个组件之间共享。 自定义hooks通常遵循这样的命名约定&…

MyBatis延迟加载缓存分页逆向工程

文章目录 延迟加载概述步骤 缓存一级缓存介绍原理 二级缓存介绍 设置缓存对象策略原理开启步骤属性解释是否使用一级缓存 分页插件使用步骤 逆向工程介绍搭建使用增删修改查 延迟加载 概述 延迟加载本身是依赖于多表查询的 延迟加载中返回值要选择resultMap返回的结果一定是D…

数学建模 —— 插值与拟合(1)

一、matlab画图 1.1 plot&#xff08;二维图形&#xff09; plot(x) —— 缺省自变量绘图格式 plot(x,y) —— 基本格式&#xff0c;以y(x)的函数关系作出直角坐标图&#xff0c;如果y为nm的矩阵&#xff0c;则以x为自变量&#xff0c;作出m条曲线 plot(x1,y1,x2,y2,…,xn,…

python循环引用和解决方法

目录 1. 延迟导入 2. 使用 importlib 3. 重构代码 4. 使用类型提示的前向引用 在Python中&#xff0c;两个文件循环引用的问题通常发生在模块相互依赖导致的导入循环。这种情况下&#xff0c;解决循环引用的方法有几种&#xff0c;以下是一些常见的解决方案&#xff1a; 1…

神经网络算法详解与前沿探索

神经网络算法详解与前沿探索 随着人工智能技术的迅猛发展&#xff0c;神经网络成为机器学习领域的重要组成部分&#xff0c;广泛应用于图像识别、自然语言处理和推荐系统等。本文将详细探讨神经网络的基本原理、结构、训练过程及其应用实例&#xff0c;并扩展至更多相关领域和…

基于标准库的STM32的外部中断EXTI

毕设已经告一段落了&#xff0c;接下来准备开始整理一下毕设中用到的知识与技术细节&#xff0c;今天整理的是STM32从编码器获取数据的方式-----外部中断&#xff08;EXTI&#xff09;&#xff1a; 外部中断分为四个硬件相关外设&#xff0c;GPIO/AFIO/EXTI/NVIC&#xff08;E…

jQuery前端开发入门图片:探索图片操作的奥秘与技巧

jQuery前端开发入门图片&#xff1a;探索图片操作的奥秘与技巧 在前端开发中&#xff0c;图片的处理与展示往往占据着举足轻重的地位。jQuery&#xff0c;作为一款流行的JavaScript库&#xff0c;为我们提供了丰富的图片操作方法和技巧。本文将通过四个方面、五个方面、六个方…

戴尔向“数”而行,以“质”致远,做新质生产力的躬耕者

【全球存储观察 &#xff5c; 热点关注】 自1984年戴尔成立&#xff0c;一路走来&#xff0c;戴尔科技集团40年长期持续的技术创新&#xff0c;一直引领全球科技行业的技术趋势。 到如今&#xff0c;AIGC风行一时&#xff0c;在重塑千行百业的同时&#xff0c;也加速了科技行业…