当前位置: 首页 > news >正文

TypeScript 学习之 function

函数可以实现抽象层,模拟类,信息隐藏和模块。
函数有:有名字的函数、匿名函数

在 JavaScript 中的函数

// 有名字的函数
function add(x, y) {return x + y;
}// 匿名函数
let myAdd = function (x, y) {return x + y;
};

函数类型

typescript 可以根据返回语句自动推断出返回值类型。
只要参数类型是匹配的,就是有效的函数类型
返回值类型是函数类型的必要部分,如果函数没有返回任何值,也必须指定返回值类型为void而不能留空。

function add(x: number, y: number): number {return x + y;
}let myAdd = function (x: number, y: number): number {return x + y;
};// 完整的类型
let myAdd: (baseValue: number, increment: number) => number = function (x: number,y: number,
): number {return x + y;
};

可选参数和默认参数

可选参数

  • TypeScript 的每个函数的参数都是必须的,会检查每个参数是否出入了值(包括nullundefined)。
  • 在参数名旁加上? 实现可选参数的功能。
  • 可选参数必须跟在必传参数后面,所以没有加?的参数在前面,加了?的参数在后面。
function buildName(firstName: string, lastName?: string) {if (lastName) {return firstName + ' ' + lastName;} else {return firstName;}
}let result1 = buildName('Bob');
// let result2 = buildName("Bob", "Adams", "Sr."); // error, 参数过多
let result3 = buildName('Bob', 'Adams');

默认参数

  • 当函数被调用,而且参数没有传递或者传递的参数值为undefined的时候。
  • 在所有必须参数后面的带默认初始化的参数都是可选的,与可选参数一样,在调用函数的时候可以省略。
  • 可选参数与末尾的默认参数共享参数类型。
  • 默认参数放在必传参数前面,就需要传入undefined来获取默认值
// 可选参数
function buildName(firstName: string, lastName?: string) {}// 默认参数
function buildName(firstName: string, lastName: string = 'Smith') {}

剩余参数

  • 剩余参数会被当作个数不限的可选参数

在 JavaScript 中,可以用arguments来访问所有传入的参数。
在 TypeScript 中,可以把所有参数收集到一个变量里。

function buildName(firstName: string, ...restOfName: string[]) {return firstName + '' + restOfName.join(' ');
}let employeeName = buildName('Joseph', 'Samuel', 'Lucas', 'MacKinzie');

this 和 箭头函数

this 在函数被调用的时候才会指定值。

let deck = {suits: ['hearts', 'spades', 'clubs', 'diamonds'],cards: Array(52),createCardPicker: function () {return function () {let pickedCard = Math.floor(Math.random() * 52);let pickedSuit = Math.floor(pickedCard / 13);return {suit: this.suits[pickedSuit], card: pickedCard % 13};};},
};let cardPicker = deck.createCardPicker();
let pickedCard = cardPicker();alert('card: ' + pickedCard.card + ' of ' + pickedCard.suit);

运行这个程序,没有弹出对话框而是报错了,因为createCardPicker返回的函数里的this被设置为window而不是deck
解决的这个问题可以用箭头函数

let deck = {suits: ['hearts', 'spades', 'clubs', 'diamonds'],cards: Array(52),createCardPicker: function () {// NOTE: the line below is now an arrow function, allowing us to capture 'this' right herereturn () => {let pickedCard = Math.floor(Math.random() * 52);let pickedSuit = Math.floor(pickedCard / 13);return {suit: this.suits[pickedSuit], card: pickedCard % 13};};},
};let cardPicker = deck.createCardPicker();
let pickedCard = cardPicker();alert('card: ' + pickedCard.card + ' of ' + pickedCard.suit);

Typescript中,这个this的类型是any

this 参数

解决this的类型明确,可以提供一个显式的this参数

// 调用时,不用传入参数
function f(this: void) {}

改造前面的this指向例子

interface Card {suit: string;card: number;
}interface Deck {suits: string[];cards: number[];createCardPicker(this: Deck): () => Card;
}let deck: Deck = {suits: ['hearts', 'spades', 'clubs', 'diamonds'],cards: Array(52),createCardPicker: function (this: Deck) {return () => {let pickedCard = Math.floor(Math.random() * 52);let pickedSuit = Math.floor(pickedCard / 13);return {suit: this.suits[pickedSuit],card: pickedCard % 13,};};},
};

this 参数在回调函数里

当一个函数传递到某个函数被调用时,会被当作一个普通函数调用,this将为undefined。使用this参数避免这个问题

interface UIElement {addClickListener(onClick: (this: void, e: Event) => void): void;
}

this: void 说明 onClick函数里的this没有类型, 所以下面的传入回调报错

class Handler {info: string;onClickBad(this: Handle, e: Event) {this.info = e.message;}
}
let h = new Handler();
uiElement.addClickListener(h.onClickBad); // error! 应该传入 this: void 的函数

如果传入的函数需要使用原来的类中的属性,就需要使用箭头函数

class Handler {info: string;onClickGood = (e: Event) => {this.info = e.message;};
}

此方法缺点:1. 每个Handler对象都会创建一个箭头函数。2. onClickGood 只会被创建一次,添加到Handler的原型链上,在不同的Handler对象间是共享的。

重载

同一个函数提供多个函数类型定义来进行函数重载。

let suits = ['hearts', 'spades', 'clubs', 'diamonds'];function pickCard(x: {suit: string; card: number}[]): number;
function pickCard(x: number): {suit: string; card: number};
function pickCard(x): any {if (typeof x === 'object') {let pickedCard = Math.floor(Math.random() * x.length);return pickedCard;} else if (typeof x === 'number') {let pickedSuit = Math.floor(x / 13);return {suit: suits[pickedSuit],card: x % 13,};}
}let myDeck = [{suit: 'diamonds',card: 2,},{suit: 'spades', card: 10},{suit: 'hearts',card: 4,},
];
let pickedCard1 = myDeck[pickCard(myDeck)];
alert('card: ' + pickedCard1.card + ' of ' + pickedCard1.suit);let pickedCard2 = pickCard(15);
alert('card: ' + pickedCard2.card + ' of ' + pickedCard2.suit);

重载后可以根据情况进行类型检查

相关文章:

TypeScript 学习之 function

函数可以实现抽象层,模拟类,信息隐藏和模块。 函数有:有名字的函数、匿名函数 在 JavaScript 中的函数 // 有名字的函数 function add(x, y) {return x y; }// 匿名函数 let myAdd function (x, y) {return x y; };函数类型 typescript 可…...

【云计算自学路线】

云计算包含的技术内容和涉及的方向比较多,一定要进行系统化的学习才能更好的掌握这门技术。 云计算作为互联网新技术领域,现阶段也是出于高速发展期,想学习加入云计算行业的小伙伴可以抓紧机会了,跟着小课一起来了解云计算以及它…...

code01 v2黑屏、花屏、死机、断电重启、休眠死机的进来

症状解决 长话简说,症状如下: 使用浏览器、播放视频等,遇到突然死机或花屏死机的情况 关闭硬件加速,如:浏览器中设置关闭硬件加速,出现这种症状的软件都需要设置 开机电流音、播放与暂停时喇叭吱吱想、打…...

分享107个HTML电子商务模板,总有一款适合您

分享107个HTML电子商务模板,总有一款适合您 107个HTML电子商务模板下载链接:https://pan.baidu.com/s/1VW67Wjso1BRpH7O3IlbZwg?pwd0d4s 提取码:0d4s Python采集代码下载链接:采集代码.zip - 蓝奏云 Aplustemplates 购物模板…...

Barra模型因子的构建及应用系列三之Momentum因子

一、摘要 在之前的Barra模型系列文章中,我们已经初步讲解、构建了Size因子和Beta因子,并分别创建了对应的单因子策略。通过回测发现,其中Size因子的小市值效应具有很强的收益能力。而本篇文章将在该系列下进一步构建Momentum因子。 二、模型…...

8.2.1.3 索引合并优化

索引合并访问方法检索具有多个范围扫描的行,并将其结果合并为一个。此访问方法仅合并来自单个表的索引扫描,而不是跨多个表的扫描。合并可以生成其基础扫描的合并、交叉或交叉的合并。 可以使用索引合并的查询示例: SELECT * FROM tbl_name…...

水雨情在线小能手-雨量水位报警站

雨量水位报警站由水位探测器、雨量传感器、报警灯、扩音器、太阳能板和采集传输控制器组成。实时采集水位等级,三个水位探测器对应3个水位等级,当现场水面浸没相应探测器时,本机会实时发出语音报警,同时可发送相应的预警/报警等级…...

【蓝桥杯集训4】双指针专题(6 / 6)

目录 3768. 字符串删减 - 滑动窗口ac 799. 最长连续不重复子序列 - 滑动窗口 800. 数组元素的目标和 - 二分ac 2816. 判断子序列 - 双指针 1238. 日志统计 - 滑动窗口 1240. 完全二叉树的权值 - 双指针 1、前缀和 - 通过了 5/12个数据 2、双指针 3768. 字符串删减 -…...

文件流,gzip解压,压缩

目录 文件画布 写入 (空文件Foutnew File(Parent,entry.getName());)FileOutputStream outnew FileOutputStream(Fout);BufferedOutputStream Boutnew BufferedOutputStream(out);其他流量基于基础包装文件--文件流---字节流 顺序pbf一般是形成后再压缩目…...

在线开会,来开开圆桌会议吧~

圆桌会议应用场景:适合内部培训、部门会议亦或是头脑风暴等较为轻松的场景,有兴趣的朋友可以联系我来测试哦~~ 上图: 图:圆桌会议应用截图 在圆桌布局之下,企业可以将每一位参会者和座位绑定,1:1模拟线下圆…...

使用营销自动化的 7 大主要优势

对于大多数企业家来说,自动化已成为在数字时代简化业务的必要条件。那么,您可以采取哪些步骤来实施营销自动化呢? 1. 社交媒体整合 拥有吸引人的社交媒体形象是成功的先决条件。您不可能完成所有社交媒体营销任务,使用自动化软件&…...

【图像分类】基于PyTorch搭建GRU实现MNIST手写数字体识别(单/双向GRU,附完整代码和数据集)

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 在https://blog.csdn.net/AugustMe/article/details/128969138文章中,我们使用了基于PyTorch搭建LSTM实现MNIST手…...

day14_oop_抽象_接口

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、抽象 三、接口 零、 复习昨日 多态的好处: 扩展性强.加入新的功能,不需要改动代码降低代码耦合度(解耦合或者松耦合) 一、抽象类 1.1 抽象类…...

模式识别 | MATLAB实现DNN深度神经网络模式分类识别

分类预测 | MATLAB实现DNN全连接神经网络多特征分类预测 目录 分类预测 | MATLAB实现DNN全连接神经网络多特征分类预测基本介绍任务描述程序设计参考资料基本介绍 DNN的结构不固定,一般神经网络包括输入层、隐藏层和输出层,一个DNN结构只有一个输入层,一个输出层,输入层和输…...

【C++】类和对象三大特性--继承

文章目录1.继承的概念及定义1.1继承的概念1.2 继承定义1.2.1定义格式1.2.2继承关系和访问限定符1.2.3继承基类成员访问方式的变化2.基类和派生类对象赋值转换3.继承中的作用域4.派生类的默认成员函数5.继承与友元6. 继承与静态成员7.复杂的菱形继承及菱形虚拟继承虚拟继承解决数…...

MySQL的存储引擎

目录 一.概念 二.分类 操作 修改默认存储引擎 一.概念 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能。现在许多不…...

工程项目管理系统源码-简洁+好用+全面-工程项目管理系统

​ ​工程项目管理系统是指从事工程项目管理的企业(以下简称工程项目管理企业)受业主委托,按照合同约定,代表业主对工程项目的组织实施进行全过程或若干阶段的管理和服务。 ​系统定义 工程项目管理企业不直接与该工程项目的总承…...

什么是STAR原则?

文章目录📋前言🔥省流版🎯什么是STAR原则🎯进行过程📋前言 对于大部分还在学习阶段的学生们来说,可能并不了解这个原则的含义,这里的star并不是指英文单词星星。这个原则我也是前段时间才认识到…...

前置知识-初值问题、显式隐式龙格库塔方法、Butcher阵列

1.1.4 龙格一库塔法 将向前欧拉法写成式 (1-37) 的形式, 可以看出它实际上利用了 f ( x , u ) f(x, u) f(x,u) 在 x n...

PythonWeb Django PostgreSQL创建Web项目(二)

安装数据库PostgreSQL并创建数据库 我第一次尝试使用PostgreSQL数据库,why?我喜欢它提供的丰富的数据类型,例如货币类型、枚举类型、几何类型(点、直线、线段、矩形等等)、网络地址类型、文本搜索类型、XML类型JSON类型等等,非常…...

Python学习笔记:使用字符串

使用字符串 使用字符串格式:精简版 百分号 % # 指定要设置其格式的值时,可使用单个值(如字符串或数字),可使用元组(如果要设置多个值得格式),还可使用字典 >>> format …...

echarts饼图封装

1. 组件 <template> <div :id"id" class"main" :style"{ width: width, height: height }" :ref"id" ></div> </template> <script> import * as echarts from "echarts"; export default { …...

Web3.0 教学基础一

目录 什么是web3.0 Web 1.0 概念 Web 2.0 概念 Web 3.0 概念 Web 3.0 的优势 什么是DAPP 什么是web3.0 在了解web3.0之前我们需要了解下前面的web1.0与web2.0。 Web 1.0 概念 Web1.0是万维网最初的版本&#xff0c;而静态网站则被认为是全网Web 1.0的起源&#xff0c;用…...

body使用渐变色无效的原因之一:html没有设置高度

直接在css文件中对body设置渐变色&#xff1a; body {height: 100%;background: -webkit-linear-gradient(120deg, #a1c4fd 0%, #c2e9fb 100%);background: -moz-linear-gradient(120deg, #a1c4fd 0%, #c2e9fb 100%);background: -o-linear-gradient(120deg, #a1c4fd 0%, #c2e…...

Python3 函数实例及演示

函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现单一&#xff0c;或相关联功能的代码段。 函数能提高应用的模块性&#xff0c;和代码的重复利用率。我们已经知道Python提供了许多内建函数&#xff0c;比如print()。但也可以自己创建函数&#xff0c;这被叫做用户…...

HTB打靶(Active Directory 101 Multimaster)

Nmap扫描 Starting Nmap 7.93 ( https://nmap.org ) at 2023-02-08 02:52 EST Stats: 0:00:51 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Scan SYN Stealth Scan Timing: About 55.85% done; ETC: 02:54 (0:00:40 remaining) Nmap scan report for 10.129…...

漏洞预警|Apache Sling JCR Base 存在JNDI注入漏洞

棱镜七彩安全预警 近日网上有关于开源项目Apache Sling JCR Base 存在JNDI注入漏洞&#xff0c;棱镜七彩威胁情报团队第一时间探测到&#xff0c;经分析研判&#xff0c;向全社会发起开源漏洞预警公告&#xff0c;提醒相关安全团队及时响应。 项目介绍 Apache Sling是一个基于…...

【学习笔记】DFA的构造

虽然平时做过但是考场上肯定还是不会&#xff0c;不过没事干还是写一下吧 Myhill-Nerode\text{Myhill-Nerode}Myhill-Nerode 定理&#xff1a;给定一个语言LLL&#xff0c;定义在字符串上一个关系为&#xff0c;若对于所有的zzz&#xff0c;xzxzxz在LLL中当且仅当yzyzyz在LLL中…...

MyBatis 之二(增、删、改操作)

文章目录1. 修改操作1.1 在 mapper&#xff08;interface&#xff09;里面添加修改方法的声明1.2 在 XMl 中添加 <update> 标签和修改的 sql 代码1.3 在 UserMapper 中右键 Generate 点击 Test 生成 update 测试类2. 删除操作2.1 在 mapper &#xff08;interface&#x…...

28k入职腾讯测试岗那天,我哭了,这5个月付出的一切总算没有白费~

先说一下自己的个人情况&#xff0c;计算机专业&#xff0c;16年普通二本学校毕业&#xff0c;经历过一些失败的工作经历后&#xff0c;经推荐就进入了华为的测试岗&#xff0c;进去才知道是接了个外包项目&#xff0c;不太稳定的样子&#xff0c;可是刚毕业谁知道什么外包不外…...

家居行业网站建设/网络广告策划的步骤

Description 草原上住着一群小松鼠&#xff0c;每个小松鼠都有一个家。时间长了&#xff0c;大家觉得应该聚一聚。但是草原非常大&#xff0c;松鼠们都很头疼应该在谁家聚会才最合理。 每个小松鼠的家可以用一个点 \((x,y)\) 表示&#xff0c;两个点的距离定义为点 \((x,y)\) 和…...

越南网站怎么做/seo实战密码

前言 PowerShell是为系统管理员设计的基于任务的自动化命令行外壳(Shell)和相关脚本环境。 它建立在.NET框架上。 它是比命令提示符(cmd)强大的命令行解释器&#xff0c;可以解释PowerShell和批处理命令。 powershell一直都是内网渗透的大热门&#xff0c;微软是真正的在推行…...

手机网站开发者模式/什么是整合营销概念

阿里篇&#xff08;仅有问题&#xff0c;没有答案需要大家共同学习探讨&#xff09; 如何实现一个高效的单向链表逆序输出&#xff1f;已知 sqrt (2)约等于 1.414&#xff0c;要求不用数学库&#xff0c;求 sqrt (2)精确到小数点后 10 位。给定一个二叉搜索树(BST)&#xff0c…...

网站建设包含以下哪些建设阶段/福建seo顾问

总线是计算机各种功能部件之间传送信息的公共通信干线&#xff0c;是由导线组成的传输线束。微机中有三种总线&#xff1a;数据总线、地址总线和控制总线&#xff1b;它们分别用来传输数据、数据地址和控制信号。本文操作环境&#xff1a;windows10系统、thinkpad t480电脑。相…...

网站建设后台管理便捷/营销工具有哪些

[Unity中文课堂教程] C#中级编程 - 01 - 可读可写属性 原教程视频地址&#xff1a; 《[Unity中文课堂教程预告片] C#中级编程_哔哩哔哩_bilibili》 《C#中级编程 - Unity中文课堂 (u3d.cn)》 内容短小精悍简练&#xff0c;每节只有几分钟。很适合用来预习和复习。 主要代码内容…...

上海什么做网站的公司比较好/浏览器下载安装

题目链接&#xff1a;http://acm.swust.edu.cn/#/problem/698/-1 1000(ms) 65535(kb) 1006 / 2689 用2 台处理机A 和B 处理n 个作业。设第i 个作业交给机器A 处理时需要时间a[i] &#xff0c;若由机器B 来处理&#xff0c;则需要时间b[i]。由于各作业的特点和机器的性能关系…...