【TypeScript】对象类型的定义

简言

在 JavaScript 中,我们分组和传递数据的基本方式是通过对象。在 TypeScript 中,我们通过对象类型来表示这些对象。
在这里插入图片描述

对象类型

在 JavaScript 中,我们分组和传递数据的基本方式是通过对象。在 TypeScript 中,我们通过对象类型来表示这些对象。
正如我们所看到的,它们可以是匿名的:

function greet(person: { name: string; age: number }) {return "Hello " + person.name;
}

或使用接口来命名:

interface Person {name: string;age: number;
}function greet(person: Person) {return "Hello " + person.name;
}

又或者使用别名:

type Person = {name: string;age: number;
};function greet(person: Person) {return "Hello " + person.name;
}

这三种方式都挺常见的,一般都是使用后两种,使用接口或别名来定义类型,简单明了,且易复用。

对象属性类型

对象类型中的每个属性都可以指定几件事:类型、属性是否可选以及属性是否可以写入,以及属性值。
定义规则如下:

  • 属性类型 – 一般是字符串类型的,如果想定义其他的类型,用方括号包裹定义属性索引修改。
  • 属性值 – 和普通的变量类型定义一样,如果提前定义好了属性值,则需要符合提前定义好的类型范围。
  • 可选属性 — 问号(?)定义。
  • 仅读属性 — 属性默认是可写入的,仅读属性需要 索引前面加 readonly 关键词。

示例:

interface Person {name: string;age: number;
}
type Shape = { kind: "circle" } | { kind: "square" };
interface PaintOptions {shape: Shape;xPos?: number;yPos?: number;
}interface ReadonlyPerson {readonly name: string;readonly age: number;
}let writablePerson: Person = {name: "Person McPersonface",age: 42,
};// works
let readonlyPerson: ReadonlyPerson = writablePerson;console.log(readonlyPerson.age); // prints '42'
writablePerson.age++;
console.log(readonlyPerson.age); // prints '43'interface StringArray {[index: number]: string;
}const myArray: StringArray = ['1','2'];
const secondItem = myArray[1];

对象索引类型

使用方括号包含索引index属性定义。

interface NumberOrStringDictionary {[index: string]: number | string;length: number; // ok, length is a numbername: string; // ok, name is a string
}

上面提前定义了属性索引类型和属性值类型,不好扩展,也可以不指定属性值,即将属性值定义为any(任何类型):

interface SquareConfig {[index: string]: any;color?: string;width?: number;
}

可以在索引属性前加readonly,这样属性值不可修改:

interface ReadonlyStringArray {readonly [index: number]: string;
}let myArray: ReadonlyStringArray = getReadOnlyStringArray();
myArray[2] = "Mallory";	//	报错

接口继承

使用接口定义的对象类型,可以使用关键词extends来继承其他接口。

interface Colorful {color: string;
}interface Circle {radius: number;
}interface ColorfulCircle extends Colorful, Circle {}const cc: ColorfulCircle = {color: "red",radius: 42,
};

类型组合

接口允许我们通过扩展其他类型来创建新类型。TypeScript 提供了另一种称为交叉类型的结构,主要用于组合现有的对象类型。
组合类型是使用 & 运算符定义的。

interface Colorful {color: string;
}
interface Circle {radius: number;
}type ColorfulCircle = Colorful & Circle;type c1 = Colorful
type c2 = Circletype c3 = c1 & c2 // Colorful & Circle

类似于数学中的并集运算。

泛型对象类型

可以使用泛型,来定义通用的对象类型。

interface Box<Type> {contents: Type;
}
//	别名也可以使用泛型
type OrNull<Type> = Type | null;type OneOrMany<Type> = Type | Type[];type OneOrManyOrNull<Type> = OrNull<OneOrMany<Type>>;

使用时,指定Type具体的类型值,其contents属性即可动态改变。

let box: Box<string>;

将 Box 视为真实类型的模板,其中 Type 是一个占位符,将被其他类型替换。当 TypeScript 看到 Box<string> 时,它会用 string 替换 Box<Type> 中 Type 的每一个实例,并最终使用 { contents: string } 这样的代码。

元组对象类型

元组有的时候在表示列表对象类型时特别适合。

function doSomething(stringHash: [string, number]) {const [inputString, hash] = stringHash;console.log(inputString);console.log(hash);
}

元组也可以使用剩余元素,但必须是数组/元组类型。

type StringNumberBooleans = [string, number, ...boolean[]];
type StringBooleansNumber = [string, ...boolean[], number];
type BooleansStringNumber = [...boolean[], string, number];

为什么可选元素和剩余元素会有用?因为它允许 TypeScript 将元组与参数列表对应起来。元组类型可用于其余参数和参数,因此:

function readButtonInput(...args: [string, number, ...boolean[]]) {const [name, version, ...input] = args;// ...
}
//	相当于
function readButtonInput2(name: string, version: number, ...input: boolean[]) {// ...
}

结语

结束了。

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

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

相关文章

Blender雕刻建模_笔刷纹理和顶点绘制

笔刷纹理 主要用于皮肤&#xff0c;纹理的雕刻。 可以修改映射方式来实现不同绘制效果。 用一张纹理来定义笔刷各个点的强度。其中白色为1&#xff0c;黑色为0。 设置笔刷纹理步骤&#xff1a; -新建一套笔刷 -强度&#xff0c;设为0.15&#xff08;可以根据需求修改&#x…

Visual Studio中的内存检测工具:程序员的必备神器

在软件开发的广阔海洋中&#xff0c;Visual Studio&#xff08;VS&#xff09;如同一位全能的船长&#xff0c;不仅提供了丰富的代码编辑和调试功能&#xff0c;还内置了多种实用的开发工具&#xff0c;其中内存检测工具更是程序员定位和解决内存泄漏问题的得力助手。本文将详细…

ACWing471. 棋盘-DFS剪枝

题目 思路 本思路参考博客AcWing 471. 棋盘 - AcWing 约束方程&#xff1a; 代码 #include <iostream> #include <cstring> #include <algorithm>using namespace std;const int N 110, INF 0x3f3f3f3f; int g[N][N], n, m, dist[N][N]; int dx[4] {-1…

接口自动化-requests库

requests库是用来发送请求的库&#xff0c;本篇用来讲解requests库的基本使用。 1.安装requests库 pip install requests 2.requests库底层方法的调用逻辑 &#xff08;1&#xff09;get / post / put / delete 四种方法底层调用 request方法 注意&#xff1a;data和json都…

基于Java+SpringBoot+Mybaties-plus+Vue+elememt 驾校管理系统 设计与实现

一.项目介绍 系统角色&#xff1a;管理员、驾校教练、学员 管理员&#xff1a; 个人中心&#xff1a;修改密码以及个人信息修改 学员管理&#xff1a;维护学员信息&#xff0c;维护学员成绩信息 驾校教练管理&#xff1a;驾校教练信息的维护 驾校车辆管理&…

在Python中,f代表着格式化字符串

在Python中&#xff0c;f代表着格式化字符串&#xff08;Formatted String&#xff09;。格式化字符串是一种方便的字符串表示形式&#xff0c;它允许您在字符串中包含变量值&#xff0c;并在运行时将其替换为实际值。使用格式化字符串&#xff0c;您可以更轻松地构建复杂的字符…

java排课算法简单demo

简化的场景设定 有限的教室数量。每个教师可以教授多个课程。每个课程在一个特定的时间段内只能安排一次。考虑教室容量和课程需求。 Java代码实现 首先&#xff0c;我们定义几个基本的类&#xff1a;Course、Teacher、Room 和 TimeSlot。 import java.util.ArrayList; imp…

【R语言】ggplot中点的样式shape参数汇总

ggplot中点的样式展示&#xff1a; library(ggplot2)# 创建数据框 a<- data.frame(x 0:25, y 0:25) # 创建散点图 ggplot(a, aes(x x, y y, shape as.factor(y))) geom_point(size 4) scale_shape_manual(values 0:25) labs(shape "形状") theme(legend.…

产品经理如何进行项目管理?

产品经理如何进行项目管理&#xff1f; 项目管理和产品管理在本质上还是有一定差别的。产品更关注的是产品、功能、方向和反馈&#xff0c;而项目则更关注进度、质量和测试等。如果团队没有项目经理&#xff0c;那么产品经理就需要兼顾对开发人员、项目进度等进行管理。 此时…

K8S搭建

文章目录 K8S搭建配置要求 安装 Kuboard-Spray加载离线资源包规划并安装集群访问集群重启Kubernetes集群Worker节点不能启动许多Pod一直Crash或不能正常访问 containerd配置网络代理 常用的 kubectl 命令&#xff1a; K8S搭建 安装高可用的Kubernetes集群 配置要求 对于 Kub…

【Linux】高效文本处理命令

目录 一.sort命令&#xff08;排序&#xff09; 1.语法格式 2.常用选项 3.相关示例 3.1. 3.2. 二.unip命令&#xff08;去重&#xff09; 1.语法格式 2.常用选项 3.相关示例 3.1. 3.2. 三.tr命令&#xff08;替换&#xff09; 1.语法格式 2.常用选项 3.相关示例…

TiDB学习2:TiDB Sever

目录 1. TiDB Server架构 2. sql语句的解析和编译 2.1 Parse ​编辑 2.2 compile 3. 行转化为KV对(聚簇表) ​编辑4. SQL 读写相关模块 4.1 DistSQL(复杂查询) 4.2 KV(简单查询) 5. 在线DDL相关模块 6. GC机制与相关模块 7. TiDB Server的缓存 8. 热点小表缓存 9. …

c++ fs::rename

【C 17 新特性 文件管理】探索C Filesystem库&#xff1a;文件和目录操作的全面指南&#xff08;一&#xff09;-阿里云开发者社区 fs::rename("old_directory", "new_directory"); 底层原理: 在Linux系统中&#xff0c;这通常通过rename系统调用来实现。…

做好串口控制是源代码防泄密的基础

在信息化时代&#xff0c;数据安全与保密工作的重要性日益凸显。尤其是在涉密单位&#xff0c;如军工、政府、金融等行业&#xff0c;防泄密工作直接关系到国家安全、社会稳定和企业利益。串口作为计算机与外部设备通信的重要接口&#xff0c;其安全性同样不容忽视。本文将探讨…

react18【系列实用教程】useMemo —— 缓存数据 (2024最新版)

为什么添加了 memo &#xff0c;子组件2依然重新渲染了呢&#xff1f; 因为父组件向子组件2传递了引用类型的数据 const userInfo {name: "朝阳",};<Child2 userInfo{userInfo} />memo() 函数的本质是通过校验Props中数据的内存地址是否改变来决定组件是否重新…

TEMU电商行情分析:未来趋势与盈利机遇探讨

近年来&#xff0c;跨境电商行业风起云涌&#xff0c;其中TEMU作为新兴力量&#xff0c;其市场表现备受关注。那么&#xff0c;TEMU电商现在的行情究竟如何?对于卖家而言&#xff0c;是否仍然是一个能够赚钱的平台呢? 首先&#xff0c;从市场趋势来看 TEMU电商正处于一个快速…

如何设计学术会议海报?

在参加学术会议的时候&#xff0c;制作一份会议海报来展示你的研究内容是十分必要的。海报是你与别人交流研究成果时的关键部分&#xff0c;也是成功科研生涯的重要元素。海报本身自带许多优秀的特质&#xff1a;思路清晰、内容精练&#xff0c;并且极易引起他人的兴趣。 一、…

vant添加列表, 日期选择总是填充到最后一个组内原因

添加多个行程, 无论在哪个行程上修改时间, 时间总是只显示在最后一个行程里 错误代码: <div class"journey"><divv-for"(item, index) in ruleform.hrms_business_item":key"index"><div class"journey-title">&l…

Python执行MYSQL SQL文件

很多情况下我们需要Python来执行SQL文件&#xff0c;但是一般库没有提供这些功能&#xff0c;直接执行经常会出错&#xff0c;这里分析各种情况下执行SQL语句的处理。如果你没有时间的话&#xff0c;直接跳转查看[第三点](#3. 包含DELIMITER的语句)。 准备工作 这里采用**mys…

Linux之函数应用实例--加法器

一、创建一个对2个整数求和的加法器 首先&#xff0c;定义了一个名为 adder 的 Bash 函数&#xff0c;该函数接受两个参数 $1 和 $2 并输出它们的和。 function adder { echo $[ $1$2 ] } 注意&#xff1a; function 关键字是可选的。在 Bash 中&#xff0c;可以简单地使…