【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 编译器会报错。


本文完~

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

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

相关文章

解决程序因缺少xinput1_3.dll无法运行的有效方法,有效修复丢失xinput1_3.dll

如果你的电脑在运行某些应用程序或游戏时提示“xinput1_3.dll丢失”或“找不到xinput1_3.dll”的错误消息,那么很可能是因为你的系统中缺少这个重要的DLL文件而导致的问题。那么电脑出现xinput1_3.dll丢失的问题时有哪些方法进行修复呢? 如何确定电脑是否…

Golang--面向对象

Golang语言面向对象编程说明: Golang也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说Golang支持面向对象编程特性是比较准确的。Golang没有类(class),Go语言的结构体(struct)和其…

PHP查询实时股票行情

记录一个实时行情接口&#xff0c;通过PHP查询实时股票行情 <?php// Special Note: // GitHub: https://github.com/alltick/realtime-forex-crypto-stock-tick-finance-websocket-api // Token Application: https://alltick.io // Replace "testtoken" in the…

深入解读 Transformer 编码器中的嵌入与位置编码

10. embedding 深入解读 Transformer 编码器中的嵌入与位置编码 在搭建 Transformer 编码器时&#xff0c;有两步至关重要&#xff1a;词嵌入&#xff08;Embedding&#xff09; 和 位置编码&#xff08;Positional Encoding&#xff09;。这两者的组合让模型不仅能够理解词汇…

语音识别中的RPM技术:原理、应用与发展趋势

目录 引言1. RPM技术的基本原理2. RPM的应用领域3. RPM技术的挑战与发展趋势4. 总结 引言 在语音识别和音频处理领域&#xff0c;RPM&#xff08;Recurrent Phase Model&#xff0c;递归相位模型&#xff09;技术正逐渐崭露头角。它作为一种创新的信号处理方法&#xff0c;通过…

IntelliJ Idea设置自定义快捷键

我IDEA的快捷键是自己修改成了和Eclipse相似&#xff0c;然后想要跳转到某个方法的上层抽象方法没有对应的快捷键&#xff0c;IDEA默认的是Ctrl U &#xff08;Windows/Linux 系统&#xff09; 或 Command U &#xff08;Mac 系统&#xff09;&#xff0c;但是我的不起作用&a…

深入探讨钉钉与金蝶云星空的数据集成技术

钉钉报销数据集成到金蝶云星空的技术案例分享 在企业日常运营中&#xff0c;行政报销流程的高效管理至关重要。为了实现这一目标&#xff0c;我们采用了轻易云数据集成平台&#xff0c;将钉钉的行政报销数据无缝对接到金蝶云星空的付款单系统。本次案例将重点介绍如何通过API接…

Python 数据结构对比:列表与数组的选择指南

文章目录 &#x1f4af;前言&#x1f4af;Python中的列表&#xff08;list&#xff09;和数组&#xff08;array&#xff09;的详细对比1. 数据类型的灵活性2. 性能与效率3. 功能与操作4. 使用场景5. 数据结构选择的考量6. 实际应用案例7. 结论 &#x1f4af;小结 &#x1f4af…

Python小白学习教程从入门到入坑------第二十七课 魔法方法(语法进阶)

目录 一、什么是魔法方法&#xff1f; 二、常见的魔法方法 三、魔法方法&魔法属性 3.1 __doc__&#xff08;&#xff09; 3.2 __module__&#xff08;&#xff09; 3.3 __class__&#xff08;&#xff09; 3.4 __str__() 3.5 __del__() 一、什么是魔法方法&#xf…

代码训练营 day57

前言 这里记录一下陈菜菜的刷题记录&#xff0c;主要应对25秋招、春招 个人背景 211CS本CUHK计算机相关硕&#xff0c;一年车企软件开发经验 代码能力&#xff1a;有待提高 常用语言&#xff1a;C 系列文章目录 第57天 &#xff1a;第十一章&#xff1a;图论part03 文章目录…

【ChatGPT】如何将ChatGPT的回答与外部数据进行结合

如何将ChatGPT的回答与外部数据进行结合 在撰写内容或进行分析时&#xff0c;将ChatGPT的回答与外部数据相结合&#xff0c;可以增加信息的深度和准确性。这种方法不仅提升了内容的权威性&#xff0c;还能为读者提供更为全面的视角。本文将探讨如何有效地结合ChatGPT的回答与外…

ML 系列:机器学习和深度学习的深层次总结( 19)— PMF、PDF、平均值、方差、标准差

一、说明 在概率和统计学中&#xff0c;了解结果是如何量化的至关重要。概率质量函数 &#xff08;PMF&#xff09; 和概率密度函数 &#xff08;PDF&#xff09; 是实现此目的的基本工具&#xff0c;每个函数都提供不同类型的数据&#xff1a;离散和连续数据。 二、PMF 的定义…

string模拟实现插入+删除

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目&#xff1a;C知识点的补充_Jason_from_China的博客-CSDN博客 string模拟实现reserve 这里实现的是扩容 扩容这里是可以实现缩容&#xff0c;可以实现…

《JVM第8课》垃圾回收算法

文章目录 1.标记算法1.1 引用计数法1.2 可达性分析法 2.回收算法2.1 标记-清除算法&#xff08;Mark-Sweep&#xff09;2.2 复制算法&#xff08;Coping&#xff09;2.3 标记-整理算法&#xff08;Mark-Compact&#xff09; 3.三种垃圾回收算法的对比 为什么要进行垃圾回收&…

编程之路:蓝桥杯备赛指南

文章目录 一、蓝桥杯的起源与发展二、比赛的目的与意义三、比赛内容与形式四、比赛前的准备五、获奖与激励六、蓝桥杯的影响力七、蓝桥杯比赛注意事项详解使用Dev-C的注意事项 一、蓝桥杯的起源与发展 蓝桥杯全国软件和信息技术专业人才大赛&#xff0c;简称蓝桥杯&#xff0c…

Redis的内存淘汰机制

Redis的内存淘汰机制用于控制内存使用情况&#xff0c;以防止内存耗尽而导致服务崩溃。其核心思想是在内存达到限制时&#xff0c;根据不同策略淘汰一些数据&#xff0c;为新的数据腾出空间。Redis 提供了多种内存淘汰策略&#xff0c;通过配置参数 maxmemory-policy 进行设置。…

全网最适合入门的面向对象编程教程:58 Python字符串与序列化-序列化Web对象的定义与实现

全网最适合入门的面向对象编程教程&#xff1a;58 Python 字符串与序列化-序列化 Web 对象的定义与实现 摘要&#xff1a; 如果我们要在不同的编程语言之间传递对象&#xff0c;就必须把对象序列化为标准格式&#xff0c;比如XML\YAML\JSON格式这种序列化Web对象。这种序列化W…

使用YOLO 模型进行线程安全推理

使用YOLO 模型进行线程安全推理 一、了解Python 线程二、共享模型实例的危险2.1 非线程安全示例&#xff1a;单个模型实例2.2 非线程安全示例&#xff1a;多个模型实例 三、线程安全推理3.1 线程安全示例 四、总结4.1 在Python 中运行多线程YOLO 模型推理的最佳实践是什么&…

每日一题|3255. 长度为 K 的子数组的能量值 II|递增序列、计数器

同昨天的解法一样&#xff0c;遍历一遍的同时&#xff0c;统计当前最长的子串长度&#xff0c;如果>k&#xff0c;则将子串开始位置处赋值子串当前位置元素的值。 class Solution:def resultsArray(self, nums: List[int], k: int) -> List[int]:res [-1] * (len(nums)…

金华迪加现场大屏互动系统 mobile.do.php 任意文件上传漏洞复现

0x01 产品描述&#xff1a; ‌ 金华迪加现场大屏互动系统‌是由金华迪加网络科技有限公司开发的一款专注于增强活动现场互动性的系统。该系统设计用于提供高质量的现场互动体验&#xff0c;支持各种大型活动&#xff0c;如企业年会、产品发布会、展览展示等。其主要功能包…