第七章 TypeScript函数的介绍和使用

image.png

  • 函数,一个再熟悉不过的话题了,之前几章里面我们也多次提到过,而且提到过各种各样的 TS 内和函数相关的内容
  • 今天,咱们来详细说一下函数内的各种详细内容的使用

文章目录

  • 一、函数的可选参数
  • 二、函数内的虚拟 this
  • 三、函数的重载

一、函数的可选参数

  • 在 TS 中,是可以给函数的参数添加类型限制的,先来看一个例子
function fn(a: number, b: number): void {}
  • 这就是一个很简单的函数
  • 我们使用的时候,只要给两个 number 类型的数据作为参数即可
  • 现在呢,我有一个想法,就是我使用这个函数的时候,第二个参数可不可以不填
  • 小伙伴: “这还不简单吗,给形参来一个默认值”
function fn(a: number, b: number = 0): void {}
  • 完成任务了,好简单
  • 但是我要说的不是这个,而是当你的逻辑内需要判断用户是不是没有传递参数的时候

image.png

  • 咱们来看下面两个需求
  • 需求1: 如果确实传递了两个参数,那么我按照两个参数去计算结果,如果第二个没有传递,我给个默认值,还是按照两餐参数去计算结果
// 比如,我们的随机数函数
function fn(a: number = 10, b: number = 0): number {return Math.floor(Math.random() * (Math.abs(a - b +1))) + Math.min()
}
  • 你传了参数,我就用你传的,你没有传递的时候,那么我就用我自己设定的默认值就好了
  • 需求2: 如果传递了两个参数,我执行两个参数的逻辑,如果第二个参数没有传递,那么我就按照一个参数来执行逻辑
// 比如,我们设置 cookie 的时候的一个简单的操作
function fn(a: string, b: string, c: number): void {let timeif (c) { time = new Date()time.setTime(time.getTime() - 1000 * 60 * 60 * 8 + 1000 * c)}document.cookie = `${ a }=${ b };expires=${ c }`
}
  • 你传递了参数 c,那么我就用,你没有传递 c,那么我就不用就好了
  • 以上两段逻辑明显不一样
  • 其实,说了这么多,我就是想告诉你们一个事情
  • 那就是函数的参数可以设置选填
function fn(a: number, b?: number): void {}
  • 只要在书写形参的时候,在形参后面加上一个 问号(?) 就可以了
  • 就像我们在对象接口内书写选填成员一样
  • 这样,这个参数就可以不传递了,也不会报错
  • 注意
    1. 必选参数不可以放在选填参数的后面

image.png

  1. 选填参数不允许设置默认值了

image.png

二、函数内的虚拟 this

  • 这里我们说的可不是函数内的 this 指向谁,而是如何对函数内的 this 进行类型限制
  • 小伙伴: " 什么,this 还需要限制吗 ? "
  • 当然了,既然是类型限制,那么我们一个也不要放过了
  • 先来看一个函数
function fn() {console.log(this.innerHTML)
}
  • 这是一个非常简单的函数
  • 如果我们把它当做某一个元素的事件处理函数,是完全没有问题的
  • 但是这里的 this 并没有做出任何限制,那么在使用的时候会不会出现问题呢 ?
  • TS 一定会考虑这个问题,所以会给你提示一个错误

image.png

  • 所以在 TS 的配置文件内,有一个配置
{"noImplicitThis": true, // false}
  • 默认值是 true,表示在你的项目内不允许出现没有类型限制的 this
  • 选填是 false,表示不管你的 this 是什么,ts 都不管了
  • 所以这是一个解决方案
  • 但是很显然,这并不友好,我们最好还是给 this 加上一个限制
  • 在这里,我们就可以在书写函数的时候,在参数的第一个位置,加上一个 this 的限制
function fn(this: HTMLDivElement) {console.log(this.innerHTML)
}
  • 这里的 this 并不是该函数的第一个参数,而是一个虚拟参数,只是限定了该函数内的 this 数据类型
  • 既然在这里已经做出了限制,那么函数内在使用的时候就不会提示错了
  • 但是也说了,这个函数在调用的时候,必须要让函数内 this 为 HTMLDivElement 类型
function fn(this: HTMLDivElement) {console.log(this.innerHTML)
}// box 是获取到得以一个 div 元素
box.onclick = fn
  • 这样就可以,完全没有问题的
function fn(this: HTMLDivElement) {console.log(this.innerHTML)
}
fn()
  • 这样就会提示错误了

image.png

  • 因为要求函数内的 this 必须是 HTMLDivElement 类型
  • 但是如果你直接调用 fn 函数的话,内部的 this 并不是 HTMLDivElement 类型
  • 就会提示错误了
  • 注意: 我们一定要分清,这个 this 限定并不是函数的第一个参数

image.png

三、函数的重载

  • 啥也不说了,先看一个例子吧
  • 有一个简单的函数,实现字符串反转操作
function fn(x: string): string {return x.split('').reverse().join('')
}
  • 在来一个函数,实现一个数字放大 100 倍的操作
function fn(x: number): number {return x * 100
}
  • 因为某些原因,我必须要要讲两个函数合并为一个函数
function fn(x: string | number): string | number {// 需要在函数内进行条件判断if (typeof x === 'number') {return x * 100} else {return x.split('').reverse().join('')}
}
  • 上面这个函数,看起来没有任何问题,我们也可以正常使用
  • 但是,我发现使用完毕以后出现了问题

image.png
image.png

  • 惊不惊喜,意不意外,这是为什么 ?
  • 根据这个函数,我们来看
  • 参数限定 : 可以是 string 也可以是 number
  • 返回值限定 : 可以是 string 也可以是 number
  • 看似没有问题,但是呢 …
  • 它并没有限制什么参数对应什么返回值
  • 比如,我们如果参数是 string,那么返回值可以是 string 或者 number
  • 比如,我们如果参数是 number,那么返回值也可以是 string 或者 number
  • 并不是我们一开始想要的
    • 参数是 string 返回值也是 string
    • 参数是 number 返回值也是 number
  • 那么当我们调用的时候,不管你传递的是什么参数
  • ts 都会认为,返回值是 string 或者 number 类型
  • 当你用返回值调用 toFixed 的时候
    • ts 就会认为,你有可能是一个 string 类型,那么 string 类型是没有 toFixed 这个方法的,所以就会提示错误
  • 也就是说,你这样写完
    • 如果你再也不用返回值了,那么没啥事
    • 但是如果你要用返回值去调用一些方法,那么只能调用两种数据类型共有的方法
  • 那我该怎么办 ?
  • 这个时候,就可以用到 函数的重载 了
  • 其实就是在定义函数之前,把这个函数我需要的几种情况列举出来
// 情况1:
function fn(x: string): string
// 情况2:
function fn(x: number): number
function fn(x: string | number): string | number {if (typeof x === 'number') {return x * 100} else {return x.split('').reverse().join('')}
}
  • 函数还是这个函数
  • 但是在这个函数之前,我们列举了两种情况
  • 参数是 string,返回值也是 string
  • 参数是 number,返回值也是 number
  • 今后在调用的时候, 就只会出现这两种情况了

image.png

  • 这样就不会报错了

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

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

相关文章

DInet

(1)数据: 1):随机获取5帧参考帧 2):处理这5帧连续帧,:source_frames:连续5帧的crop_moth b)audio_list:连续5帧的每一帧对应的5帧音频mel特征 c):refs:fintune 固定参考帧&#xff0…

懒洋洋作业讲解

懒洋洋作业讲解 环境配置 1.软件下载:DCloud - HBuilder、HBuilderX、uni-app、uniapp、5、5plus、mui、wap2app、流应用、HTML5、小程序开发、跨平台App、多端框架 2.软件介绍 HBuilder是由DCloud(数字天堂)推出的一款面向HTML5的Web开发…

【ArcGISPro】后台选项卡详解

添加后台选项卡 添加后的界面 文件变化 Config.daml修改内容对应文件详情 Classname就是我们在点击控件后具体执行的内容 BackstageTab1ViewModel与BackstageTab1 BackstageTabButton 1 执行效果 执行代码 读者直接往OnClick中添加执行的代码即可 尝试修改 代码 效果 Backs…

Java性能优化(一):Java基础-ArrayList和LinkedList

引言 集合作为一种存储数据的容器,是我们日常开发中使用最频繁的对象类型之一。JDK为开发者提供了一系列的集合类型,这些集合类型使用不同的数据结构来实现。因此,不同的集合类型,使用场景也不同。 很多同学在面试的时候&#x…

打破次元壁!Stable Diffusion将现实影像转成二次元动画,推特转赞10k+,网友:都可以重做《神奇宝贝》动漫了

破次元壁计划已启动! 就在最近,有网友分享了一个用Stable Diffusion打造二次元动画的工具,直接在网上爆火。 先快来看一波效果。 万物皆可妙化为二次元,耳机也可蜕变成小兔兔: 瞧!连易拉罐的拉环也化身成…

考研管理类联考(专业代码199)数学基础【3】函数、方程、不等式

一、函数 1.一次函数 y kx b(k≠0) 的图象及性质 2.二次函数y ax^2 bx c的图象和性质 3.指数函数y a^x ( a>0,且a≠1)的图象和性质 4.对数函数y logₐx ( a>0,且a≠1)的图象与性质 二、方程 1.一元…

开抖音小店需要交多少保证金?全类目选择,一篇了解

哈喽~我是电商月月 做抖音小店前大家都会搜索“入驻抖音小店需要准备什么东西?”其中就包含了一项:类目保证金的缴纳 那到底要交多少钱?很多新手朋友还是不太了解 今天我就给大家解答这个问题,首先,我们要知道抖店的…

Mybatis 源码分析

《黑马架构师_源码系列-主流框架&中间件》-- MyBatis (讲师:子慕) * 手写持久层框架-仿写mybatis * Mybatis架构设计&主要组件 * Mybatis如何完成的初始化? * Mybatis如何完成的sql解析及执行? * Mybatis如何设置的参数? * Mybat…

List的两种实现

前置知识: 数组 baseAddress:数组的首地址 dataTypeSize:数组中元素类型的大小,如int为4字节 为什么数组索引从0开始,假如从1开始不行吗? 在根据数组索引获取元素的时候,会用索引和寻址公式来计…

网络安全之DHCP详解

DHCP:Dynamic Host Configration Protocol 动态主机配置协议 某一协议的数据是基于UDP封装的,当它想确保自己的可靠性时,这个协议要么选确认重传机制,要么选周期性传输。 DHCP是确认重传,【UDP|DHCP】,当DHCP分配完地…

这个Python库Streamlit,5分钟内搭建可视化WEB应用

在数据科学的世界里,将分析结果快速、直观地呈现给非技术背景的决策者,是一项重要的技能。而Streamlit,这个开源的Python库,正是为此而生。它允许数据科学家和工程师通过少量的代码,快速创建和分享数据应用。今天&…

citylava:城市场景中VLMs的有效微调

citylava:城市场景中VLMs的有效微调 摘要IntroductionRelated WorkVision-Language ModelsVLMs in Driving Methodology CityLLaVA: Efficient Fine-Tuning for VLMs in City Scenario 摘要 在城市广阔且动态的场景中,交通安全描述与分析在从保险检查到事故预防的各…

QGraphicsItem的prepareGeometryChange 和 update方法区别

prepareGeometryChange 这个函数用于为图形的几何形状变化做准备。在改变一个项目的边界矩形之前调用此函数,以保持 QGraphicsScene 的索引是最新的。如果必要的话,prepareGeometryChange() 会调用 update()。QGraphicsScene认为所有图元的boundingRect…

一个圈圈的机制玩法

什么是一个圈圈,说白了就是一个撸广告的平台,只是引入了减产机制,九维机制和分成机制,再加上有央企背景,做的一个区块链平台。 玩法很简单,就是撸广告获取能量,然后获取绿色能量,等…

AI绘画Stable DIffusion 室内设计—普通人秒变精装设计师,轻松接单!

AI 绘画赚 300 块不算多,但只用了10分钟。 大家好,我是灵魂画师向阳 一直以来精装设计师对专业特别是美学的把握,是我们普通人无法启迪的。但是AI时代来了,普通人只要把房子毛坯的照片交给AI绘图工具,10分钟轻松就能…

区块链 | NFT 相关论文:Preventing Content Cloning in NFT Collections(三)

🐶原文: Preventing Content Cloning in NFT Collections 🐶写在前面: 这是一篇 2023 年的 CCF-C 类,本博客只记录其中提出的方法。 F C o l l N F T \mathbf{F_{CollNFT}} FCollNFT​ and Blockchains with Native S…

11.偏向锁原理及其实战

文章目录 偏向锁原理及其实战1.偏向锁原理2.偏向锁案例代码演示2.1.偏向锁案例代码2.2.1.无锁情况下状态2.1.2.偏向锁状态2.1.3.释放锁后的状态 2.2.偏向锁的膨胀和撤销2.2.1.偏向锁撤销的条件2.2.2.偏向锁的撤销 2.2.3.偏向锁的膨胀 2.3.全局安全点原理和偏向锁撤销性能问题2.…

“王翦五讨赏地,萧何三贬其身”的背后,正是智者安身的处世之道

冯子曰:智者,术所以生也;术者,智所以转也。 智慧的人,从不蛮行横性,而是懂得如何在世道和自我之间谋得最佳的处境。 01、王翦五讨赏地 战国时期,秦始皇派王翦率六十万大军攻打楚国&#xff0…

AI换脸原理(3)——人脸对齐介绍

人脸对齐简介 人脸对齐其实包含两个步骤:人脸关键点检测、人脸对齐,英文术语有facial landmark和face alignment,主要用于精确标识眉毛、眼睛、鼻子、嘴巴以及人脸轮廓等特征部位。不同数据集对于关键点的数量有不同的设定,最少的是标记5个关键点,通常包括两只眼睛的瞳孔…

通过 Java 操作 redis -- list 列表基本命令

目录 使用命令 lpush,lrange,rpush 使用命令 lpop 和 rpop 使用命令 blpop,brpop 使用命令 llen 关于 redis list 列表类型的相关命令推荐看Redis - list 列表 要想通过 Java 操作 redis,首先要连接上 redis 服务器&#xff…