【TS】九天学会TS语法——3.TypeScript 函数

今天学习 TypeScript 的函数,包括函数类型、可选参数、默认参数、剩余参数。

  1. 函数声明和表达式
  2. 函数类型
  3. 可选参数和默认参数
  4. 剩余参数

在 TypeScript 中,函数是编程的核心概念之一。它们允许我们将代码组织成可重用的块,并提供了强大的抽象能力。在本文中,我们将深入探讨 TypeScript 函数的各种特性,包括函数类型、可选参数、默认参数和剩余参数。

一.函数声明和表达式

在 TypeScript 中,我们可以通过函数声明函数表达式来定义函数。函数声明具有函数名,而函数表达式则没有。

// 函数声明
// 定义了一个名为 add 的函数,它接受两个数字类型的参数 a 和 b
// 并返回它们的和,返回值类型也是数字
function add(a: number, b: number): number {
    return a + b; // 返回参数 a 和 b 的和
}

// 函数表达式
// 定义了一个匿名函数并将其赋值给变量 subtract
// 这个函数接受两个数字类型的参数 a 和 b,并返回它们的差,返回值类型也是数字
const subtract = (a: number, b: number): number => {
    return a - b; // 返回参数 a 减去 b 的结果
};

(1)函数声明

  1. 使用 function 关键字来声明。
  2. 函数声明会被提升,可以在声明之前调用它。
  3. 通常用于顶层作用域或模块中。
greet('清清ww'); // 输出: Hello, 清清ww!

function greet(name) {
  console.log('Hello, ' + name + '!');
}

greet('清清ww'); // 输出: Hello, 清清ww!

在这个例子中,我们定义了一个名为 greet 的函数,它接受一个参数 name 并打印一条问候语。由于函数声明会被提升,我们可以在声明之前调用 greet 函数。

(2)函数表达式

  1. 使用变量赋值的方式来定义函数。
  2. 函数表达式不会提升,必须在定义之后才能调用。
  3. 可以立即调用或作为匿名函数传递给其他函数。
const greet = function(name) {
  console.log('Hello, ' + name + '!');
};

greet('清清ww'); // 输出: Hello, 清清ww!

在这个例子中,我们使用了一个函数表达式来定义一个匿名函数,并将其赋值给变量 greet。然后通过变量名 greet 来调用这个函数。由于函数表达式不会被提升,我们不能在声明之前调用它。

二.函数类型

TS 允许我们为函数定义类型。函数类型包括参数类型和返回类型。

在 TypeScript 中,函数类型是指函数的参数类型返回类型的组合。TypeScript 允许我们为函数定义类型,以确保函数的参数和返回值符合预期的类型。函数类型通常用于函数声明、函数表达式和箭头函数。

1.函数类型声明

函数类型声明是一种显式指定函数参数类型和返回类型的方式。它使用 function 关键字,后跟参数列表和返回类型。

// 函数类型声明
let greet: (name: string) => string;

// 函数实现
greet = function(name: string): string {
  return 'Hello, ' + name + '!';
};

const message = greet('清清ww');
console.log(message); // 输出: Hello, 清清ww!

在上面的例子中,我们首先声明了一个函数类型 greet,它接受一个 string 类型的参数 name,并返回一个 string 类型的值。然后,我们为 greet 赋予了一个具体的函数实现。

2.函数类型表达式

函数类型表达式是一种更简洁的函数类型声明方式。它使用箭头函数语法 => 来定义函数类型。

// 函数类型表达式
let greet: (name: string) => string;

// 函数实现
greet = (name: string): string => {
  return 'Hello, ' + name + '!';
};

const message = greet('清清ww');
console.log(message); // 输出: Hello, 清清ww!

在上面的例子中,我们使用箭头函数语法来定义函数类型 greet。这种方式更加简洁,但功能与函数类型声明相同。

3.函数类型推断

TypeScript 具有类型推断功能,它可以根据函数的实现自动推断函数的类型。如果没有显式指定函数类型,TypeScript 会尝试推断函数的类型。

// 函数类型推断
let greet = function(name: string): string {
  return 'Hello, ' + name + '!';
};

const message = greet('清清ww');
console.log(message); // 输出: Hello, 清清ww!

在上面的例子中,我们没有显式指定函数类型,但 TypeScript 会根据函数的实现自动推断函数的类型。

三.可选参数和默认参数

TypeScript 允许我们定义可选参数和默认参数。可选参数在函数调用时可以省略,而默认参数在未提供值时使用默认值。

1.可选参数

可选参数是指在调用函数时可以省略的参数,通过在参数后面添加一个问号 ? 来表示该参数是可选的。可选参数通常位于参数列表的末尾。

// 可选参数
function greet(name: string, age?: number): string {
  if (age) {
    return `你好${name},你${age} 岁了!`;
  } else {
    return `你好, ${name}!`;
  }
}

console.log(greet('清清ww')); // 输出: 你好, 清清ww!
console.log(greet('清清ww', 3)); // 输出: 你好, 清清ww, 你3岁了!

在上面的例子中,greet 函数的 age 参数是可选的。当调用 greet 函数时,如果没有提供 age 参数,函数会返回一个没有年龄信息的问候。

2.默认参数

默认参数是指在调用函数时如果没有提供该参数,则使用默认值的参数。在 TypeScript 中,通过在参数后面赋值来设置默认值。

// 默认参数
function greet(name: string, age: number = 3): string {
  return `你好, ${name}, 你${age}岁了!`;
}

console.log(greet('清清ww')); // 输出: 你好, 清清ww, 你3岁了!
console.log(greet('清清ww', 3)); // 输出: 你好, 清清ww, 你3岁了!

在上面的例子中,greet 函数的 age 参数有一个默认值 3。当调用 greet 函数时,如果没有提供 age 参数,函数会使用默认值 3

3. 可选参数和默认值的优先级

当同时使用可选参数和默认值时,它们的优先级是按照参数的顺序来确定的。

  1. 如果一个参数既有默认值又是可选的,那么在调用函数时,如果省略了这个参数,就会使用默认值。
  2. 如果一个参数是可选的但没有默认值,那么在调用函数时,可以省略这个参数,函数会将其视为 undefined
  3. 如果一个参数有默认值但不是可选的,那么在调用函数时,必须提供这个参数的值,否则会使用默认值。
// 可选参数和默认参数的优先级
function greet(name: string, age?: number = 3): string {
  return `你好, ${name}, 你${age} 岁了!`;
}

console.log(greet('清清ww')); // 输出: 你好, 清清ww, 你3岁了!
console.log(greet('清清ww', undefined)); // 输出: 你好, 清清ww, 你3岁了!
console.log(greet('清清ww', 4)); // 输出: 你好, 清清ww, 你4岁了!

在上面的例子中,age 参数既被标记为可选,又被赋予了默认值3。当调用 greet 函数时,如果没有提供 age 参数,函数会使用默认值3。如果提供了 age 参数,即使值为 undefined,函数也会使用默认值 3

四.剩余参数

剩余参数是通过在参数名前加上三个点(…)来定义的,并且它必须是函数的最后一个参数。它允许我们将多个参数收集到一个数组中(在处理不确定数量的参数时非常有用)。这样就可以在函数内部使用这个参数作为数组来访问所有的剩余参数。

举个例子:一个名为 createPerson 的函数,它接受一个对象和一个剩余参数:

// 定义一个 Person 类型,包含 name, age 和可选的 hobbies 数组
type Person = {
    name: string;
    age: number;
    hobbies?: string[];
};

// 定义一个函数 createPerson,接受一个 Person 类型的对象和剩余的字符串参数作为爱好
function createPerson(person: Person, ...hobbies: string[]): Person {
    // 检查是否有提供爱好
    if (hobbies.length > 0) {
        // 如果有爱好,将它们赋值给 person 对象的 hobbies 属性
        person.hobbies = hobbies;
    }
    // 返回修改后的 person 对象
    return person;
}

// 创建一个基础的人物对象,包含 name 和 age 属性
let basePerson: Person = {
    name: '清清ww',
    age: 3,
};

// 使用 createPerson 函数添加额外的爱好,剩余参数 'eat', 'play', 'sleep' 被视为一个数组
let personWithHobbies = createPerson(basePerson, 'eat', 'play', 'sleep');

// 打印包含爱好的 person 对象
console.log(personWithHobbies);

在这个例子中,createPerson 函数接受一个 Person 类型的对象和一个剩余参数 。剩余参数是一个二维数组,其中每个元素是一个 [key, value] 对,用于添加或更新 Person 对象的属性。

调用 createPerson 函数时,我们首先创建了一个基础的人物对象 basePerson,然后使用剩余参数添加了爱好 hobbies。打印出的personWithHobby 对象包含了所有的基础属性和额外的爱好属性。

注意:剩余参数必须是函数的最后一个参数。如果在剩余参数之后定义了其他参数,TypeScript 编译器会报错。


本文完~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kafka 源码 KRaft 模式本地运行

KRaft(Kafka Raft Metadata mode),从版本 2.8.0 开始作为测试特性引入,并在后续版本中持续得到改进和增强。 KRaft 模式是指 Kafka 使用 Raft 协议来管理集群元数据的一种运行模式,这标志着 Kafka 向去除对 ZooKeeper …

day05(单片机)SPI+数码管

目录 SPI数码管 SPI通信 SPI总线介绍 字节交换原理 时序单元 ​​​​​​​SPI模式 模式0 模式1 模式2 模式3 数码管 介绍 74HC595芯片分析 ​​​​​​​原理图分析 ​​​​​​​cubeMX配置​​​​​​​ 程序编写 硬件SPI ​​​​​​​软件SPI 作业: SPI数…

数据结构和算法-贪心算法01- 认识贪心

贪心算法 什么是贪心算法 一个贪心算法总是做出当前最好的选择,也就是说,它期望通过局部最优选择从而得到全局最优的解决方案。 ​ ----《算法导论》 贪心算法(Greedy Method): 所谓贪心算法就是重复地(或贪婪地)根据一个法则挑选解的一部分。当挑选完毕…

创新实践:基于边缘智能+扣子的智慧婴儿监控解决方案

在2024年全国大学生物联网设计竞赛中,火山引擎作为支持企业,不仅参与了赛道的命题设计,还为参赛队伍提供了相关的硬件和软件支持。以边缘智能和扣子的联合应用为核心,参赛者们在这场竞赛中的方案展现出了卓越的创新性和实用性&…

6款IntelliJ IDEA插件,让Spring和Java开发如虎添翼

文章目录 1、SonarLint2、JRebel for IntelliJ3、SwaggerHub插件4、Lombok插件5、RestfulTool插件6、 Json2Pojo插件7、结论 对于任何Spring Boot开发者来说,两个首要的目标是最大限度地提高工作效率和确保高质量代码。IntelliJ IDEA 是目前最广泛使用的集成开发环境…

CSS弹性布局:灵活布局的终极指南

在网页设计中,CSS 弹性布局(Flexbox)是一个不可或缺的工具。它能帮助你轻松地排列和对齐元素,尤其是在响应式设计中表现出色。今天,我们就来深入探讨一下 Flexbox 的各个属性,让你彻底掌握这个强大的布局工…

论文阅读:Computational Long Exposure Mobile Photography (一)

这篇文章是谷歌发表在 2023 ACM transaction on Graphic 上的一篇文章,介绍如何在手机摄影中实现长曝光的一些拍摄效果。 Abstract 长曝光摄影能拍出令人惊叹的影像,用运动模糊来呈现场景中的移动元素。它通常有两种模式,分别产生前景模糊或…

CTF入门教程(非常详细)从零基础入门到竞赛,看这一篇就够了!

目录 一、CTF简介 二、CTF竞赛模式 三、CTF各大题型简介 四、CTF学习路线 4.1、初期 1、htmlcssjs(2-3天) 2、apachephp (4-5天) 3、mysql (2-3天) 4、python (2-3天) 5、burpsuite (…

linux 进程调度学习笔记

https://zhuanlan.zhihu.com/p/1248579228 吐血整理 | 肝翻 Linux 进程调度所有知识点 执行调度 Kernel 判断当前进程标记是否为 TIF_NEED_RESCHED,是的话调用 schedule 函数,执行调度,切换上下文,这也是上面抢占(preempt)机制的…

django图书管理系统-计算机毕业设计源码00648

摘要 图书管理系统在数字化阅读趋势、图书馆自动化管理、用户体验需求和信息技术应用等方面具有重要的研究意义。图书馆自动化管理系统的引入和应用提高了图书借阅过程的效率和准确性,减少了对手工操作和纸质记录的需求。用户对系统的易用性、查询速度、借还流程有更…

SQL实战训练之,力扣:2020. 无流量的帐户数(递归)

目录 一、力扣原题链接 二、题目描述 三、建表语句 四、题目分析 五、SQL解答 六、最终答案 七、验证 八、知识点 一、力扣原题链接 2020. 无流量的帐户数 二、题目描述 表: Subscriptions ------------------- | Column Name | Type | ------------------- | accoun…

ARM base instruction -- ccmp (immediate)

Conditional Compare (immediate) sets the value of the condition flags to the result of the comparison of a register value and an immediate value if the condition is TRUE, and an immediate value otherwise. 此指令一般出现在 cmp 指令之后,表示双重比…

【支付行业-支付系统架构及总结】

记得第一次看埃隆马斯克(Elon Musk)讲第一性原理的视频时,深受震撼,原来还可以这样处理复杂的事务。这篇文章也尝试化繁为简,探寻支付系统的本质,讲清楚在线支付系统最核心的一些概念和设计理念。 虽然支付…

【系统面试篇】进程和线程类(1)(笔记)——区别、通讯方式、同步、互斥、锁分类

目录 一、问题综述 1. 进程和线程的区别? 2. 进程的状态有哪些? 3. 进程之间的通信方式? (1)管道 (2)消息队列 (3)共享内存 (4)信号量 &#xff08…

Java算法OJ(6)归并分治

目录 1.前言 2.正文 2.1归并分治的概念 2.2计算数组的小和 2.2.1题目 2.2.2示例 2.2.3代码 2.3翻转对 2.3.1题目 2.3.2示例 2.3.3代码 3.小结 1.前言 哈喽大家好吖,今天继续来给大家带来Java算法——归并分治的讲解,学习这篇的前提可以先把…

【网络】自定义协议——序列化和反序列化

> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:了解什么是序列化和分序列,并且自己能手撕网络版的计算器。 > 毒鸡汤:有些事情,总是不明白,所以我不…

Abaqus随机骨料过渡区孔隙三维网格插件:Random Agg ITZ Pore 3D (Mesh)

插件介绍 Random Agg ITZ Pore 3D (Mesh) V1.0 - AbyssFish 插件可在Abaqus内参数化建立包含水泥浆基体、粗细骨料、界面过渡区(ITZ)、孔隙在内的多相材料混凝土细观背景网格模型。 模型说明 插件采用材料映射单元的方式,将不同相材料赋值…

【含开题报告+文档+源码】基于SpringBoot+Vue智能居民健康检测系统设计与实现

开题报告 随着社会发展和人民生活水平的提高,人们对健康生活的要求越来越高。而广大居民由于条件限制,存在着健康管理服务不足的问题。本文基于JavaWeb技术,设计并实现了一种居民健康检测系统。首先,本文对该平台的需求进行了分析…

基于Multisim8路抢答器电路仿真电路(含仿真和报告)

【全套资料.zip】8路抢答器电路仿真电路Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 1.设计数字式抢答器,每组选手具有一个抢答按钮。 2.电路具有第一抢答信号的鉴别和锁存…

Java 网络编程(一)—— UDP数据报套接字编程

概念 在网络编程中主要的对象有两个:客户端和服务器。客户端是提供请求的,归用户使用,发送的请求会被服务器接收,服务器根据请求做出响应,然后再将响应的数据包返回给客户端。 作为程序员,我们主要关心应…