当前位置: 首页 > news >正文

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

相关文章:

  • Harmony os Next——Ble蓝牙模块
  • Linux 自动化升级Jar程序,指定Jar程序版本进行部署脚本
  • 【银角大王——Django课程——Ajax请求】
  • FJSP:波搜索算法(WSA)求解柔性作业车间调度问题(FJSP),提供MATLAB代码
  • 压测工具sysbench
  • 性能监控计算——封装带性能计算并上报的npm包(第三章)
  • 【TIPs】 Visual Stadio 2019 中本地误使用“git的重置 - 删除更改 -- hard”后,如何恢复?
  • 初识SDN
  • python-数据可视化(总)
  • Qt for Android
  • 代码随想录--哈希表--两数之和
  • 关于模拟信道和数字信道根本区别的探讨
  • 常用maven - jar 下载与 安装
  • 国产可视化爬虫助力AI大模型训练:精准爬取汉语词典
  • cv2函数实践-图像处理(中心外扩的最佳RoI/根据两个坐标点求缩放+偏移后的RoI/滑窗切片/VOC的颜色+调色板)
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 07.Android之多媒体问题
  • Angular Elements 及其运作原理
  • C++入门教程(10):for 语句
  • CODING 缺陷管理功能正式开始公测
  • MySQL主从复制读写分离及奇怪的问题
  • Spring-boot 启动时碰到的错误
  • WePY 在小程序性能调优上做出的探究
  • 从0到1:PostCSS 插件开发最佳实践
  • 服务器从安装到部署全过程(二)
  • 前端面试之闭包
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 自动记录MySQL慢查询快照脚本
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​渐进式Web应用PWA的未来
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #NOIP 2014# day.2 T2 寻找道路
  • #Z0458. 树的中心2
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (39)STM32——FLASH闪存
  • (办公)springboot配置aop处理请求.
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (七)glDrawArry绘制
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (四)进入MySQL 【事务】
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET Core 2.1路线图
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .Net Redis的秒杀Dome和异步执行
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .Net的DataSet直接与SQL2005交互
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • @JsonFormat与@DateTimeFormat注解的使用
  • @media screen 针对不同移动设备