TypeScript系列:续篇 - 对象类型(含数组、元数组、函数)

在 TypeScript 中,对象类型用于定义对象的形状(shape),即对象包含哪些属性以及这些属性的类型。

对象类型可以是具体的,也可以是抽象的,用于类型检查和类型推断。

对象类型的最基本形式:接口(Interface)类型别名(Type Alias)

🚎 接口 interface :适合定义对象的形状,并且可以被扩展和实现,这使得它在面向对象编程中非常有用。
🚃 类型别名 type :更灵活,可以定义更复杂的类型,包括联合类型、交叉类型、字面量类型和映射类型。

typeinterface
扩展interface B extends A { … }type B = A & { ... }
添加新字段重新定义即可对已声明的type无法添加新属性,可以使用&运算符重新定义一个类型
interface Test {a: string;
}
// 向现有接口添加新字段
interface Test {b: number;
}
Test // { a: string; b: number; }
  • 同一个属性如果有多个类型声明,彼此不能有类型冲突;
  • 同名方法有不同的类型声明,那么会发生函数重载;后面的定义比前面的定义具有更高的优先级。

属性修饰符

interface Man {name: string,age?: number;	 // 等价于 age: number | undefined;readonly sex: '男';
}

注意:可以使用 ,; 来分隔属性。

  • 属性末尾添加问号 (?) 来将这些属性标记为可选;
  • 属性标记为 readonly 只读,在类型检查期间无法写入。

属性索引1

interface A {[prop: string]: number;
}

属性名只要是字符串,都符合类型要求。

‼️ 属性索引仅允许 stringnumbersymbol 、模板字符串模式以及仅包含这些的联合类型。

interface TestAry {[index: number]: string;length: number;
}

泛型对象类型

interface Box {contents: any;
}

contents 类型不确定时,设置为 any 有效,但可能发生错误。

if (typeof x.contents === "string") {x.contents.toLowerCase()
}

🏇 创建一个通用 Box 类型

interface Box<Type> {contents: Type;
}let numberBox: Box<number> = { contents: 42 };
let stringBox: Box<string> = { contents: 'ligang' };

等价于

interface NumberBox {contents: number;
}interface StringBox {contents: string;
}let numberBox: NumberBox = { contents: 42 };
let stringBox: StringBox = { contents: 'ligang' };

✔️ 使用泛型,当需要一个新类型的 Box 时,根本不需要声明。

注意,类型别名也可以是泛型

type OrNull<Type> = Type | null;
type OneOrMany<Type> = Type | Type[];
type OneOrManyOrNull<Type> = OrNull<OneOrMany<Type>>;
type OneOrManyOrNullStrings = OneOrManyOrNull<string>;

Array 类型

Array 本身是一个泛型类型

function doSomething(value: Array<string>): void {// ...
}

Array<string> 等价于 string[]

let arr: (number | string)[];
let arr: Array<number | string>;

元数组

⚽️ 元组类型是另一种 Array 类型,它确切地知道它包含多少个元素,以及它在特定位置包含哪些类型。=> 元组必须明确声明每个成员的类型。

type StringNumberBooleans = [string, number, ...boolean[]];
type StringBooleansNumber = [string, ...boolean[], number];
type BooleansStringNumber = [...boolean[], string, number];
  • StringNumberBooleans 描述了一个元组,其前两个元素分别是 stringnumber,但后面可以有任意数量的 boolean
  • StringBooleansNumber 描述了一个元组,它的第一个元素是 string,然后是任意数量的 boolean,并以 number 结尾;
  • BooleansStringNumber 描述了一个元组,其起始元素是任意数量的 boolean,以 stringnumber 结尾。

函数类型

在声明函数时,需要给出参数的类型返回值的类型

// 方式一
function sayHi(name: string): void {}// 方式二
const sayHi: (name: string) => void = function (name) {}// 方式三
type myFunc = (str: string) => void
const sayHi: myFunc = function (name) {}
  • void 类型表示函数没有返回值

可选参数&参数默认值

如果存在可选参数,可选参数只能在参数列表的尾部。

function sayHi(name: string, age?: number): void {}

如果存在参数默认值,可以省略参数类型声明(因为可以从默认值推断出来)。

function sayHi(name = 'ligang'): void {}

可选参数与默认值不能同时使用。

function sayHi(name? = 'ligang'): void {} // 参数不能包含问号和初始化表达式

参数解构

参数结构结合接口(interface)或类型别名(type),更简洁。

// 方式一
function sum({ a, b }: { a: number; b: number }): number {return a + b;
}// 方式二
interface SumParams {a: number;b: number;
}
function sum({ a, b }: SumParams): number {return a + b;
}

rest 参数

rest 参数表示函数剩余的所有参数,它可以是数组(类型相同),也可能是元组(类型不同)。

// rest 参数为数组
function joinNumbers(...nums: number[]) {}// rest 参数为元组
function f(...args: [boolean, number]) {}

  1. https://typescript.p6p.net/typescript-tutorial/interface.html ↩︎

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

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

相关文章

数据库视图和索引

参考链接&#xff1a; 数据库的视图和索引的概念和区别_索引和视图的区别-CSDN博客 MySQL 数据库--索引&#xff08;理论详解及实例演示&#xff09;_数据库索引-CSDN博客 1.视图 视图是从一个或多个表中导出来的表&#xff0c;是一种不是一种真正存在的概念。这样&#xf…

CUDA int128相乘是怎么实现的

CUDA int128相乘是怎么实现的 一.指令对应关系1.cuda C代码2.PTX代码[二个int64]3.SASS指令[多个u32] 二.复现过程 CUDA int128相乘是怎么实现的 一.指令对应关系 1.cuda C代码 clock_t t0clock64(); __prof_trigger(0); int128_t r4r2*r3; //二个int128_t相加 __prof_trig…

Android Glide:让图片加载从未如此简单

在 Android 开发中,图片加载一直是一个关键环节。无论是从网络还是本地加载图片,都需要考虑到性能、内存管理和用户体验等多个方面。而在这方面,Glide 成为了众多开发者的首选库之一。本文将带你深入了解 Glide 的强大之处,并介绍如何在项目中快速集成和使用 Glide。 为什…

外包干了三年,快要废了。。。

先简单说一下自己的情况&#xff0c;普通本科&#xff0c;在外包干了3年多的功能测试&#xff0c;这几年因为大环境不好&#xff0c;我整个人心惊胆战的&#xff0c;怕自己卷铺盖走人了&#xff0c;我感觉自己不能够在这样蹉跎下去了&#xff0c;长时间呆在一个舒适的环境真的会…

算法刷题:300. 最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

300. 最长递增子序列 1.dp定义&#xff1a;dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度 2.递推公式&#xff1a;if (nums[i] > nums[j]) dp[i] max(dp[i], dp[j] 1); 注意这里不是要dp[i] 与 dp[j] 1进行比较&#xff0c;而是我们要取dp[j] 1的最大值…

JAVA 的excel数据批量导入解析 现在都用什么API工具 Apache POI 、EasyExcel 、easypoi有什么区别

&#x1f4dd;个人主页&#x1f339;&#xff1a;个人主页 ⏩收录专栏⏪&#xff1a;SpringBoot &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339;&#xff0c;让我们共同进步&#xff01; 在Java中&#xff0c;处理Excel数据批量导入解析时&#xff0c;常…

高空抛物检测算法的应用场景解析

高空抛物事件频发&#xff0c;对公众安全构成严重威胁。无论是居民区还是商业中心&#xff0c;从高层建筑中丢弃物品都可能导致人员伤亡和财产损失。传统的监控手段多以事后追溯为主&#xff0c;无法在事发时及时预警和干预。为应对这一难题&#xff0c;视觉分析技术的发展为高…

全国历年高考真题2008-2024

目录 分享链接&#xff1a; ⬇️⬇️⬇️ 点击下载

单元测试之mock使用

一、简介 一般程序中A类的m1方法调用B类的m2方法&#xff0c;而B类的m2方法又调用了C类的m3方法以此类推等等&#xff0c;而其中的某个方法的一些数据又需要调用其它服务或者查询数据库&#xff0c;一般单元测试只针对某个功能进行测试&#xff0c;但是如上面的情况在做单元测试…

Day9 | Java框架 | SpringBoot

Day9 | Java框架 | SpringBoot SpringBoot简介入门程序概述起步依赖 基础配置配置文件格式&#xff1a;3种yaml语法规则yaml数据读取三种格式 多环境启动配置文件参数命令行参数多环境开发控制&#xff1a;Maven & SpringBoot 多环境兼容 配置文件分类&#xff1a;4种 整合…

蓝桥杯4. Fizz Buzz 经典问题

题目描述 给定一个整数 NN&#xff0c;从 1 到 NN 按照下面的规则返回每个数&#xff1a; 如果这个数被 3 整除&#xff0c;返回 Fizz。如果这个数被 5 整除&#xff0c;返回 Buzz如果这个数能同时被 3 和 5 整除&#xff0c;返回 FizzBuzz。如果这个数既不能被 3 也不能被 5…

本地部署Llama 3.1大模型

Meta推出的Llama 3.1系列包括80亿、700亿、4050亿参数版本&#xff0c;上下文长度扩展至12.8万tokens&#xff0c;并增加了对八种语言的支持。 部署模型需要用到Ollama的一个工具&#xff0c;访问官方网站https://ollama.com 点击下载&#xff0c;选择下载你对应的操作系统下…

【无标题】Efinity 0基础进行流水灯项目撰写(FPGA)

文章目录 前言一、定义概念 缩写1. 二、性质1.2. 三、使用步骤编译常见错误1. 没加分号2. end 写多了 编译成功的标志总结参考文献 前言 数电课设 使用 FPGAIDE 使用 Efinity 一、定义概念 缩写 1. 二、性质 1. 2. 三、使用步骤 python代码块matlab代码块c代码块编译…

C# HttpClient 实现HTTP Client 请求

为什么? C# httpclient get 请求和直接浏览器请求结果不一样 为了测试一下HTTP接口的,用C# HttpClient实现了HTTP客户端,用于从服务端获取数据。 但是遇到了问题:C# httpclient get 请求和直接浏览器请求结果不一样 初始代码如下: using var client = new HttpClient()…

手把手带你拿捏C指针(2)(含冒泡排序)

文章目录 一、数组名的理解二、使用指针访问数组三、一维数组传参本质四、冒泡排序五、二级指针六、指针数组七、指针数组模拟二维数组 一、数组名的理解 在上⼀个章节我们在使⽤指针访问数组的内容时&#xff0c;有这样的代码&#xff1a; int arr[10] {1,2,3,4,5,6,7,8,9,…

工信部【信创认证】全面解读,包含信创集成项目管理师,信创规划管理师等

行业背景 国资委发布79号文件&#xff1a;详细规划了中央企业和国有企业信创国产化的实施路径和时间表&#xff0c;明确提出了到2027年100%完成信创“替代”的宏伟目标。这一政策不仅涵盖了芯片、基础软件、操作系统、中间件等重要领域&#xff0c;更意味着从2023年起&#xf…

微信小程序能不能有一种公共的分包,能被普通的分包引用其资源?(内有解决方案)

微信小程序中的跨分包引用与独立分包&#xff1a;优化加载速度和资源复用的利器 微信小程序开发过程中&#xff0c;开发者常常面临如何优化小程序加载速度、减少重复代码和提高资源复用率的问题。微信小程序提供了一些新的技术特性&#xff0c;比如跨分包引用和独立分包分包异…

5天涨粉3W!26个视频12.2W粉!AI做这种视频这么火嘛?

前几天刷到一个AI视频的账号&#xff0c;当时刷到时候才9W粉丝&#xff0c;今天又刷到他&#xff0c;已经12.2W了&#xff01;这涨粉速度&#xff0c;简直了&#xff01;&#xff01; 26个视频&#xff0c;12.2万粉丝 在这个看脸的时代&#xff0c;内容创作者们为了吸引眼球&a…

3.js - 着色器设置点材质(螺旋星系特效)

上图 着色器设置点材质时&#xff0c;在顶点着色器中&#xff0c;最好设置gl_PointSize&#xff0c;不然看不到你在页面中添加的点 main.js import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControlsimport gsap from gsapimp…

【截图服务 +打包】pkg打包 puppeteer

目录 最后结论 windows打包成服务 定制executablePath 用程序来查找chrome.exe 代替上面的写配置文件 服务遇到的问题 使用java开一个线程启动 遇到的问题与解决 版本匹配问题 打出包后的运行报错问题 linux下的安装 安装n 库缺少 程序运行后的报错 制作 运行报…