【TypeScript】对函数类型的约束定义

news2024/10/8 19:44:25

导读

函数是JavaScript 中的 一等公民
概念:函数类型的概念是指给函数添加类型注解,本质上就是给函数的参数和返回值添加类型约束

文章目录

  • 声明式函数:
  • 表达式函数:
  • 箭头函数
    • 可选参数和默认参数:
    • 参数默认值:
    • 过剩参数的处理:
    • 函数重载:
    • 函数的 Void 类型
    • 函数的 never 类型
  • 总结:

在这里插入图片描述

声明式函数:

在 TypeScript 中,一个函数有输入和输出,需要对其进行约束,需要把输入和输出都考虑到。

其中函数声明式的类型定义较简单:

可以给要接收的参数指定类型,也可以给函数的返回值约束类型。

//函数表达式,命名函数
function add(a: number, b: number): number {
    return a + b
}

上述案例说明:

  • 当函数参数被注解类型之后,不但约束了传递参数的类型,还限制了参数为必填
  • 函数返回值被类型注解后,也限制了函数体内部 return 出去的值,必须要满足类型要求

函数添加类型注释的好处是:

  • 避免以为参数不对,导致的函数内部逻辑错误
  • 对函数起到说明作用

注意:
输入多余的(或者少于要求的)参数,是不被允许的

//函数表达式,命名函数
function add(a: number, b: number): number {
    return a + b
}
console.log(add(5, 2 , 1));

在这里插入图片描述

表达式函数:

如果要我们现在写一个对函数表达式的定义,可能会写成这样:

//函数表达式,匿名函数
let sum = function (a: number, b: number): number {
    return a + b
}

箭头函数

//函数表达式,回调箭头函数
let callback = (a: number, b: number): number => {
    return a + b
}

箭头函数 表达式 还可以使用 【类型别名】 来进一步简化函数类型注解

注意:类型别名 抽离类型的方式,只能运用在 箭头函数表达式中

type ADD = (a: number, b: number) => number //通过类型别名,对类型进行抽离,还可达到复用的效果。

let callback: ADD = (a, b) => {
    return a + b
}

let n = callback(12, 96)
console.log(n);  //108

这样也是可以通过编译的,不过事实上,上面的代码只对等号右侧的匿名函数进行了类型定义,而等号左边的 callback 和 sum,是通过赋值操作进行类型推论而推断出来的,严格意义上来说,在TS中,这并不是最完整的写法。所以完整的写法需要我们手动给 函数 添加类型,则应该是这样:

匿名函数完整版写法:

//函数表达式,命名函数
let sum: (a: number, b: number) => number = function (a: number, b: number): number {
    return a + b
}

箭头函数表达式完整版写法:

//函数表达式,回调箭头函数
let callback: (a: number, b: number) => number = (a: number, b: number): number => {
    return a + b
}

注意
千万不要混淆了 TypeScript 中的=>和 ES6 中的 =>在 TypeScript 的类型定义中,=>用来表示函数的定义,左边是输入类型,需要用括号括起来,右边是输出类型


可选参数和默认参数:

可选参数:

前面提到的方式,如果输入多余的(或者少于要求的)参数,是不被允许的。但有时候,传递的参数是处于未知的,这时候就需要配置 可选参数了

Infinity 接口定义类型中的可选属性类似,我们用 ? 表示可选的参数

//声明式函数
function add(a: number, b?: number): number {
    return a + b
}
//函数表达式,命名函数
let sum: (a: number, b?: number) => number = function (a: number, b: number): number {
    return a + b
}
//函数表达式,回调箭头函数
let callback: (a: number, b?: number) => number = (a: number, b: number): number => {
    return a + b
}

// 这时候当我们只一个参数值的时候,也不会报错!!!
console.log(add(5));
console.log(sum(3));
console.log(callback(9));

注意:

定义可选参数后,可选参数必须接在必需参数后面。换句话说,可选参数后面不允许再出现必需参数了,可选参数可以不传,但是一但传了,也依然需要约束其类型。

在这里插入图片描述

参数默认值:

ES6 中,我们允许给函数的参数添加默认值,TypeScript 中会将添加了默认值的参数自动识别为可选参数

值得注意: 除声明式函数可以直接赋值默认值外,函数表达式,以及回调函数表达式,定义默认值,必须要搭配 ?可选属性。

//函数声明 ,命名函数
function add(a: number, b: number = 123): number {
    return a + b
}
//函数表达式,命名函数
let sum: (a: number, b?: number) => number = function (a: number, b: number = 798): number {
    return a + b
}
//函数表达式,回调箭头函数
let callback: (a: number, b?: number) => number = (a: number, b: number = 456): number => {
    return a + b
}

console.log(add(5));
console.log(sum(3));
console.log(callback(9));

此时就不受「可选参数必须接在必需参数后面」的限制了


过剩参数的处理:

在ES6 中,可以使用 ...来整合或解构参数,在TypeScript 中同样可以使用 ... 的方式获取函数中的剩余参数(rest 参数)

//函数声明 ,命名函数
function add(a?: number, b: number = 132, ...args: number[]): number {
    console.log(args); //[7, 9, 6]
    return a + b
}
//函数表达式,命名函数
let sum: (a: number, b?: number, ...args: number[]) => number = function (a: number, b: number = 798, ...args: number[]): number {
    console.log(args); // [4, 7, 9, 6]
    return a + b
}
//函数表达式,回调箭头函数
let callback: (a: number, b?: number, ...args: number[]) => number = (a: number, b: number = 456, ...args: number[]): number => {
    console.log(args); //[5, 4, 7, 9, 6]
    return a + b
}

console.log(add(5, 4, 7, 9, 6));
console.log(sum(3, 5, 4, 7, 9, 6));
console.log(callback(9, 3, 5, 4, 7, 9, 6));

事实上,args 是一个数组。所以我们可以用数组的类型来定义它:

注意... 整合参数只能是最后一个参数。


函数重载:

定义了一个 add 函数,希望可以对字符串和数字类型进行相加:

function add(a1: number | string, a2: number | string) {
    return a1 + a2; // 报错
  }
  
  // 方式一:联合类型
  function add(a1: number | string, a2: number | string) {
    if (typeof a1 === "number" && typeof a2 === "number") {
      return a1 + a2;
    } else if (typeof a1 === "string" && typeof a2 === "string") {
      return a1 + a2;
    }
  }
  
//   add(10, 20);
  /**
   * 通过联合类型有两个缺点:
   *  1.进行很多的逻辑判断(类型缩小)
   *  2.返回值的类型依然是不能确定
   *  3.返回值不能够精确的表达,输入为数字的时候,输出也应该为数字,输入为字符串的时候,输出也应该为字符串。
   */
  
  // 解决方式二:函数重载 函数的名称相同, 但是形参不同的多个函数, 就是函数的重载
  // 我们可以去编写不同的重载签名(overload signatures)来表示函数可以以不同的方式进行调用
  // 一般是编写两个或者以上的重载签名,再去编写一个通用的函数实现
  function add(num1: number, num2: number): number; // 没函数体
  function add(num1: string, num2: string): string;
  
  // 具体实现函数,不能直接调用来处理逻辑哦
  function add(num1: any, num2: any): any {
    if (typeof num1 === "string" && typeof num2 === "string") {
      return num1.length + num2.length;
    }
    return num1 + num2;
  }
  
  const result1 = add(20, 30);
  const result2 = add("abc", "cba");
  console.log(result1);
  console.log(result2);

函数的 Void 类型

Void 类型 表示无返回值
概念:JS中的有些函数只有功能没有返回值,此时使用void进行返回值注解,明确表示函数没有函数值

注意事项: :在JS中如何没有返回值,默认返回的是undefined,在TS中 void和undefined不是一回事,undefined在TS中是一种明确的简单类型,如果指定返回值为undefined,那返回值必须是undefined类型

void 返回值类型,约束了,函数不能返回 “有效值” ,可以返回 null,undefined,或者 只有 return 关键字,更甚至,return 关键字都可以不需要存在。就是不能返回 任何 有效值

function fn(): void {
    // return null
    // return undefined
    return
}

函数的 never 类型

与 Void 类型类似,不过比 Void 类型,更加的绝对化,函数体中,连 return 关键字都不能出现,一但出现 return 关键字,不论有没有返回有效值,就会报错。所以说从某种意义上来说。never 类型 是 void 类型的 升级严格模式版

function fn():never{
    throw new Error('终止')
}

总结:

本章节,主要给大家介绍了,在 TypeScript 中,围绕着函数,来对函数做一系列的,类型约束的使用讲解。毫无疑问,函数在 JS 或 TS 中,都扮演十分重要的角色,所以掌握它,也是必备的技能之一。


🚵‍♂️ 博主座右铭:向阳而生,我还在路上!
——————————————————————————————
🚴博主想说:将持续性为社区输出自己的资源,同时也见证自己的进步!
——————————————————————————————
🤼‍♂️ 如果都看到这了,博主希望留下你的足迹!【📂收藏!👍点赞!✍️评论!】
——————————————————————————————

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

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

相关文章

脚本 打开 cmd 跳转到某个文件夹并执行某些命令

很多时候我们需要启动windows安装的redis、nacos等。 通常我们可以打开安装软件的目录,在文件夹目录那一栏输入cmd,再执行相关启动命令但是这样比较麻烦,现在我们写一个bat脚本,直接启动脚本就可以实现启动程序了。 例如, 1&…

docker入门讲解

目录 第 1 章 Docker核心概念与安装 为什么使用容器? Docker是什么 Docker设计目标 Docker基本组成 容器 vs 虚拟机 Docker应用场景 Linux 安装 Docker 第 2 章 Docker镜像管理 Docker 容器管理 Docker 容器数据持久化 Docker 容器网络 Dockerfile 定制…

JAVA的数据类型与变量

目录 1. 字面常量 2. 数据类型 3. 变量 3.2 长整型变量 3.3 短整型变量 3.4 字节型变量 3.5双精度浮点型 3.6 单精度浮点型 3.7字符型变量 3.8布尔型变量 4.类型转换 4.1自动类型转换(隐式) 4.2强制类型转换(显式) 5.字符串类型 1. 字面常量 字面常量的分类&am…

深度学习之梯度下降算法

0.1 学习视频源于:b站:刘二大人《PyTorch深度学习实践》 0.2 本章内容为自主学习总结内容,若有错误欢迎指正! 1 线性模型 1.1 通过简单的线性模型来举例: 1.2 如图,简单的一个权重的线性模型&#xff0c…

透明屏的应用范围广吗?

透明屏是一种新型的显示技术,它可以使屏幕显示的内容透明,让用户可以同时看到屏幕上的图像和背后的物体。 透明屏的应用领域非常广泛,可以用于商业广告、展览展示、智能家居等多个领域。 透明屏的原理是利用透明材料和光学技术,…

通过el-tab切换Echarts图表显示不全问题

一、背景 在让日常开发中很多时候会通过el-tab选项卡方式去分类统计数据,本文我们主要是针对统计中用到了echarts图表,在刚接触时可能会遇到默认选项卡可以正常显示图表数据,但是切换选项卡以后会出现图表大小出现问题,当然原因就…

第2集丨webpack 江湖 —— 创建一个简单的webpack工程demo

目录 一、创建webpack工程1.1 新建 webpack工程目录1.2 项目初始化1.3 新建src目录和文件1.4 安装jQuery1.5 安装webpack1.6 配置webpack1.6.1 创建配置文件:webpack.config.js1.6.2 配置dev脚本1.7 运行dev脚本 1.8 查看效果1.9 附件1.9.1 package.json1.9.2 webpa…

MyBatisPlus之DML编程控制

MyBatisPlus之DML编程控制 1. id生成策略控制(Insert)1.1 id生成策略控制(TableId注解)1.2 全局策略配置id生成策略全局配置表名前缀全局配置 2. 多记录操作(批量Delete/Select)2.1 按照主键删除多条记录2.…

【java实习评审】对小说更新时间点的并发压力的短链接接口实现比较到位

大家好,本篇文章分享一下【校招VIP】免费商业项目“推推”第一期书籍详情模块java同学的代码周最佳作品。该同学来自西安邮电大学通信工程专业。本项目亮点难点:1 热门书籍在更新点的访问压力,2 书籍更新通知的及时性和有效性,3 书…

GlobalProtect-点击连接按钮无响应

GlobalProtect-点击连接按钮无响应 解决方案 重启PanGPS服务 点击连接

C++输入字符串函数cin.getline()

1.函数作用 接受一个字符串,可以接收空格并输出。 2.函数的完整形式 cin.getline(字符数组名,字符个数,结束标志) 第三个参数可以省略,当第三个参数省略之后,系统默认为’\0’。 若指定参数“字符个数”为n,则利用cout函数输出…

LiveGBS流媒体平台GB/T28181常见问题-TOKEN有效期是多久如何设置token有效期StreamToken和URLToken

LiveGBS中TOKEN有效期是多久如何设置token有效期StreamToken和URLToken 1、获取TOKEN2、TOKEN有效期3、默认token有效期3、自定义token加密key3.1、token_key3.2、stream_token_key 4、如何配置一直有效的token4.1、URLToken4.2、StreamToken 5、动态有效期6、流地址鉴权开启后…

《微SaaS创富周刊》第9期:如何把创业者访谈,变成年收入100万+美元的生意

导读 大家好!第9期《微SaaS创富周刊》面世啦(点击这里阅读第1期),感谢大家的关注和阅读!本周刊面向独立开发者、早期创业团队,报道他们主要的产品形态——微SaaS如何变现的最新资讯和经验分享等。所谓微Sa…

Pytorch学习笔记1:张量+训练参数传入与处理+制作训练集

文章目录 Pytorch中张量的一些常见函数最基础也最常见的方法关于Indexing, Slicing, Joining, Mutating Ops(索引、切片、聚合、旋转)随机种子torch.bernoulli(input)torch.normaltorch.rand(size)torch.randn(size)torch.randperm(n) Python--argparse-…

vue3自定义指令 vue中常用自定义指令

文章目录 vue3自定义指令1.什么是自定义指令&#xff1f;2.注册自定义指令2.1 全局注册2.2 局部注册<script setup>中注册&#xff1a;<script>中使用&#xff1a; 3.钩子函数参数详解4.指令传值5.总结 常用自定义指令案例v-longpressv-debounce vue3自定义指令 除…

智能财务分析-亿发财务报表管理系统,赋能中小企业财务数字化转型

对于许多中小企业来说&#xff0c;企业重要部门往往是财务和业务部门。业务负责创收&#xff0c;财务负责控制成本&#xff0c;降低税收风险。但因管理机制和公司运行制度的原因&#xff0c;中小企业往往面临着业务与财务割裂的问题&#xff0c;财务数据不清晰&#xff0c;无法…

2023年下半年广州/深圳软考信息系统项目管理师报名

信息系统项目管理师是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目之一&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职称资…

Vue3 axios数据请求封装

Vue3 axios数据请求封装 环境&#xff1a;vue3tsvite 首先在项目目录下安装axios 运行 npm install axios 成功后在package.json文件会显示。 目录&#xff1a; request.ts文件代码&#xff1a; import axios from axiosconst request axios.create({baseURL:https://api.…

装配木牛前雷达的2023款创维汽车EV6被评为“最强主动安全车型”

近日&#xff0c;全新升级的2023款创维EV6改款车型接受了中国汽车技术研究中心&#xff08;以下简称“中汽中心”&#xff09;的安全碰撞实验。据称&#xff0c;该款车型在主动安全测试中得分率高达98.97%&#xff0c;这近满分的成绩再次刷新了国内主动安全汽车排行榜&#xff…