TS快速入门-函数

2023-05-16

在TS里,虽然已经支持类,命名空间和模块,但函数仍然是主要的定义行为的地方

TS中的函数大部分和JS相同,不同之处在于ts会给函数返回值和参数加上类型声明

在TS中,函数仍然是最基本、最重要的概念之一

函数类型定义

函数类型的定义包括对参数返回值的类型定义

1. 直接定义函数类型

function sayMyself(name: string, age: number): string {
    return `我是${name},我今年${age}`;
}

const sayMyself = (name: string, age: number) => {
    return `我是${name},我今年${age}`;
}

console.log(sayMyself('温情key', 23));  // 我是温情key,我今年23岁

function printMsg(warn: string): void {
    console.warn('警告信息', warn);
}

const printMsg = (warn: string): void => {
    console.warn('警告信息', warn);
}

printMsg('警告警告123');  // 警告信息 警告警告123

如果在这里省略参数的类型,TypeScript 会默认这个参数是 any 类型;

如果省略返回值的类型
要是函数无返回值,那么 TypeScript 会默认函数返回值是 void 类型;
要是函数有返回值,那么 TypeScript 会根据定义的逻辑推断出返回类型。

2. type定义函数类型

/* 先利用type声明一个函数 */
type Submit = (user: string, props: object) => string;

/* 再根据函数的声明实现函数 */
const submitHandle: Submit = (user, props) => {
    return `提交成功, ${user}`
    // return 123     // 返回一个数字会报错,错误信息如下
    // 不能将类型“(user: string, props: object) => number”分配给类型“Submit”。  不能将类型“number”分配给类型“string”。
}

submitHandle('温情key', { age: 22 });
// submitHandle(123, { age: 22 });  // error   类型“number”的参数不能赋给类型“string”的参数。

3. interface定义函数类型

使用接口可以清晰地定义函数类型

interface AddInt {
    (x: number, y: number): number;
}

const add: AddInt = (a, b) => {
    return a + b
}


//  不能将类型“(a: number, b: number) => string”分配给类型“AddInt”。
//  不能将类型“string”分配给类型“number”。
// const add: AddInt = (a: number, b: number) => {
//     return 'wwww'
// }

函数参数定义

1. 可选参数

可选参数的定义只需要在参数后面加一个 ?

const add = (x: number, y: number, z?: number): number => {
    return x + y + ( z ? z : 0 )
}

console.log(add(1 , 2));  // 3
console.log(add(1 , 2, 3));  // 6

可选参数可以是一个或者多个

const add = (x: number, y?: number, z?: number): number => {
    return x + ( y ? y : 0 ) + ( z ? z : 0 )
}

console.log(add(1 , 2));  // 3

一旦出现可选参数后面只能跟可选参数

const add = (x: number, y?: number, z: number): number => {  // error   必选参数不能位于可选参数后
    return x + ( y ? y : 0 ) + ( z ? z : 0 )
}

2. 默认参数

默认参数只需要给参数赋一个初值

const add = (x, y = 20) => {
    console.log(x + y);
}

add(10);  // 30
add(10, 70);  // 80

当为参数指定了默认参数时,TS会识别默认值推断此参数的类型。在调用函数时,如果实参类型和默认参数类型不一致则会报错

const add = (x, y = 20) => {
    console.log(x + y);
}

add(10);  // 30
add(10, '70');  // error  类型“string”的参数不能赋给类型“number”的参数。

当然也可以显式的给默认参数设置类型

const add = (x: number, y: number = 20): void => {
    console.log(x + y);
}

add(10);  // 30
add(10, 60);  // 70

3. 剩余参数

剩余参数会被当做个数不限的可选参数。 可以一个都没有,同样也可以有任意个。 编译器会创建参数数组,名字是在 省略号... 后面给定的名字,可以在函数体内使用这个数组。

const add = (...args: number[] ) => {
    const res = args.reduce((pre, cur) => {
       return pre + cur
    })
    console.log(res);
}

add(1, 2, 3); // 6
add(10, 20, 30, 50, 90);  // 200

函数重载

函数名相同, 而形参不同的多个函数

所谓函数重载就是同一个函数,根据传递的参数不同,会有不同的表现形式。

在JS中, 由于弱类型的特点和形参与实参可以不匹配, 是没有函数重载这一说的 但在TS中, 与其它面向对象的语言就存在此语法

// 需求: 定义一个add函数,它可以接收2个string类型的参数进行拼接,也可以接收2个number类型的参数进行相加 

// 重载函数声明
function add (x: string, y: string): string;
function add (x: number, y: number): number;

// 定义函数实现
function add(x: string | number, y: string | number): string | number | undefined {
    if(typeof x === 'string' && typeof y === 'string') return x + y;
    else if(typeof x === 'number' && typeof y === 'number') return x + y;
}

console.log(add(1, 2));  // 3
console.log(add('温情', 'key'));  // 温情key


console.log(add(1, 'key'));  // 报错信息如下
// 第 1 个重载(共 2 个),“(x: string, y: string): string”,出现以下错误。
// 类型“number”的参数不能赋给类型“string”的参数。
// 第 2 个重载(共 2 个),“(x: number, y: number): number”,出现以下错误。
// 类型“string”的参数不能赋给类型“number”的参数。

注意: 函数重载只能用 function 来定义,不能使用interface type来定义。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TS快速入门-函数 的相关文章

  • 平均数的增长百分比

    设一个数A和一个数B xff0c 若A B要增长百分之30 xff0c 那么A和B的数值变化将呈现这样的规律 xff1a 1 若B不变 xff0c A增长百分之30 xff0c 则可达到整体增长百分之30 2 若A不变 xff0c B减少百
  • 2022.11.2

    字字句句切切思 心心念念欲语迟
  • 夜思 思芳愿静

    夜抚红烛垂泪 xff0c 才觉银月满身 若人若物若非故 心无可期念无数 声声难抑切切思 xff0c 心心相念欲语迟 流水长东恨满怀 xff0c 人生长憾憾无穷 才下眉梢 xff0c 又上心头 xff0c 如影相随 xff0c 何羡相思
  • 2011/11/26

    听雨听风听愁绵 xff0c 疏雨薄衣心无涟
  • 2022 12 3

    将遭遇的苦难试做上天所给予的理所当然 xff0c 当撑不下去后 xff0c 就用肉泥与血液筑就保护幸福和快乐的围墙 xff0c 人的一生便如此草草地收尾了
  • 国考申论近日书写注意点总结

    一定要审题审清楚 xff0c 它叫你概括问题就主要重心放在问题上 提前做好要点的主题词书写 xff0c 确保后续主题词的书写不会太过垃圾 一定要根据提前安排的行数进行书写 xff0c 不能因为字数的充裕就进行肆意的书写
  • 公共服务设施

    学校 xff1a 小学 xff0c 中学 xff0c 大学 xff0c 中等专业技术学校 xff0c 职业培训机构 xff0c 寄宿制高中和特殊学校 xff0c 幼 xff08 托 xff09 儿园等 医院 xff1a 综合医院 xff0c
  • 倡议书书写细节

    一般来说倡议书所给的材料是一些榜样事迹 xff0c 然后叫你去写相关的倡议书 xff0c 可能是学习榜样精神 或者是榜样行为 xff0c 但是一般来说就是从精神层面或者行为层面进行相关的倡议 当日也可以精神 行为同步倡议 这个时候倡议书的开
  • 倡议书题目所遇困难记录

    充实学习生活明确人生方向 该篇倡议书的主要书写困难在 xff1a 长期以来我训练的相关材料都是与乡村振兴 基层治理以及产业发展相关 xff0c 与榜样事迹精神提炼是相去甚远 xff0c 所以在这方面的训练就比较少 xff0c 所以相关的提炼
  • 文化共享惠民生短评

    文化共享惠民生 今日故宫博物院养心殿多件文物移驾至首都博物馆 xff0c 以亲民 开放姿态融入大众生活 但是 xff0c 各地文物资源闲置情况普遍存在 对此 xff0c 让文物走出封闭确有必要 而梁祝遗存与各地美术馆在该方面工作开展十分值得
  • 自然场景文本检测识别 - 综述

    自然场景文本检测识别 综述 Part II 坚果粥 xff1a 自然场景文本检测识别 综述 Part I26 赞同 1 评论文章 拥有这些背景知识后 xff0c 我们可以开始学习自然场景文本检测识别 xff08 STR xff09 的算法模
  • 议论文写作结构

  • 议论文书写总结

    观点如何引入以及背后原理 议论文的书写有一个常用的书写模板 xff0c 也就是五分三式 有人说这种模板的得分不高 xff0c 也有人只要核心内容切实 不空范 xff0c 论证严谨就也是可以的 那么议论文该如何才能写好 以下仅为随笔 xff0
  • 议论文开头的引出原理

    相信大家都写过议论文 xff0c 议论文开头如果用大家普遍的描述去形容 xff0c 便是用温和的方式将观点进行引出 xff0c 但是此句话太过浅薄 xff0c 难以深入实质 原理 议论文的开头从本质上来说 xff0c 是大脑在看到题干所给的
  • 面试总结1

    总结 xff1a 面试不是以模板为驱动 xff0c 是以题目为驱动 与申论书写类似 xff0c 以模板为驱动 xff0c 只会削足适履 xff0c 让自己没有办法较好地发挥出来 xff0c 流畅性以及自身的创新性都没有办法较好地得到体现 以
  • 模式识别 一

    模式识别 教材选择模式识别基本概念模式识别的主要方法应用领域模式识别与机器学习的区别模式识别典型过程前修基础课程课后问题解答1 简述特征空间优化的方法2 简述分类器的设计准则3 简述分类器设计的基本方法4 简述在什么情况下分类器不可分5 分
  • Docker 持久化存储 Bind mounts

    Docker 持久化存储 Bind mounts Bind mounts 的 v 与 mount 区别启动容器基于bind mount挂载到容器中的非空目录只读 bind mountcompose 中使用 bind mount 官方文档 x
  • BGP路由技术详解(一)

    BGP路由技术详解 xff08 一 xff09 前言一 BGP路由协议概述1 BGP定义2 BGP的特点3 BGP分类4 BGP的路径矢量特征5 BGP的路由器6 BGP Peer 二 自治系统AS的概念1 定义2 AS号3 传输AS中的路
  • 计算机网络知识点(三) 数据链路层

    目录 第三章 数据链路层 3 1 数据链路层的设计问题 3 1 1 提供给网络层的服务 3 1 2 成帧 3 1 3 差错控制 3 1 4 流量控制 3 2 差错检测和纠正 3 2 1 纠错码 3 2 2 检错码 3 3 基本数据链路层协议
  • IP地址划分子网

    前言 记录的内容仅是本人在学习IP的路上的一些心得体会 IP组成 网络号 43 主机号 其实说到底就是一连串的二进制 地址分类 A类 xff1a 10 0 0 0 xff5e 10 255 255 255 B类 xff1a 172 16 0

随机推荐

  • 电脑网络(校园网/热点)持续连不上,连上后自动断联

    ipconfig flushdns xff1a 无效重启解决 xff1a
  • 工厂模式

    1 工厂方法 针对一个产品一个工厂 span class token keyword interface span span class token class name Moveable span span class token pun
  • 使用VSCode快速提交Gitee

    使用VSCode提交Gitee 前言下载GitGitee创建仓库使用VSCode克隆仓库到本地源代码管理界面说明保存账号密码 xff0c 不用每次提交输入 前言 每次用GitHub都要FQ xff0c 所以改用Gitee 下载Git Git
  • 配置webpack-dev-server自动化

    1 注意版本 xff0c 可能会有冲突 个人建议使用以下版本 xff0c 本人没有出现冲突 34 webpack 34 34 5 42 1 34 34 webpack cli 34 34 4 9 2 34 34 webpack dev se
  • Docker容器时间和服务器时间相差8小时

    项目场景 xff1a 在微服务部署时使用docker作为容器 xff0c 部署在服务器上时间不一致 问题描述 在服务器上使用docker进行项目部署时 xff0c docker容器时间和服务器时间相差8小时 xff0c 导致插入数据库时间不
  • anaconda中使用pip无法安装库到指定环境下的问题(已解决)

    参考文章 xff1a https blog 51cto com u 15060549 4662570 login 61 from csdn 大致意思就是通过修改site py文件中的 这段代码 xff0c 将这两个变量修改为环境自身的路径即
  • 使用Java实现HDFS文件读写

    1 HDFS读文件 2 HDFS写文件 3 实例操作 3 1新建Mawen工程 3 2在pom xml中将标签中内容替换为以下代码 xff0c 静待依赖包下载完毕 lt dependencies gt lt dependency gt lt
  • GD32F303移植FreeRTOS多任务调度只能执行一个任务解决办法

    1 问题描述 GD32F303移植完FreeRTOS后创建多个任务 xff0c 运行的时候只有一个任务在运行 xff0c 其余任务处于卡死不运行状态 xff0c void start task void pvParameters taskE
  • npm显示升级到最新版本仍然显示npm为原版本的问题解决

    文章目录 前言一 问题描述二 问题原因三 解决方法1 查看npm安装路径2 修改npm全局安装路径命令3 npm更新命令 总结 前言 在升级npm版本时遇到了显示版本升级成功 xff0c 但是在继续执行npm v命令查看npm版本时仍然显示
  • 教你做一个属于自己的平衡小车,用STM32F103单片机实现(代码篇)

    平衡小车软件篇 平衡小车硬件篇 目录 一 定时器相关代码 1 TIM2 2 TIM3和TIM4 二 中断相关代码 三 电机相关代码 四 OLED屏幕和MUP6050相关代码 五 PID函数 1 直立环 2 速度环 3 转向环 六 控制函数
  • MySQL报错Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column whic

    报错信息 报错信息及语句如下 span class token keyword SELECT span i span class token punctuation span sku id sku id span class token p
  • Ros2 Foxy:apt-get update过程中密钥问题

    本人在Ubuntu20 04中根据官方文档Foxy安装Rox2出现 The following signatures couldn t be verified because the public key is not available
  • CSS解决高度塌陷的几种方式

    浮动元素对兄弟元素的影响 当设置元素浮动时 xff0c 会脱离文档流 xff0c 飘在不设置浮动兄弟元素的上面 xff0c 不占据底下的屏幕位置 注意文字是不会被浮动元素覆盖掉 清除浮动的方式 两个元素同时设置浮动 clear both 清
  • Integer值比较

    包装类与基本数据类型 包装类是将基本数据类型封装成一个类 xff0c 包含属性和名称 使用 xff1a 在使用过程中 xff0c 会涉及到自动装箱和自动拆箱 装箱 xff1a 将基本数据类型转换成包装类 span class token c
  • java理解向上转型和向下转型

    在讲述向上转型和向下转型之前 我们先简单讲解下多态 如果后续看了有关多态的讲解还是不弄 只能自己上网去查阅和理解 多态概念 多态是面向对象程序设计 xff08 OOP xff09 的一个重要特征 xff0c 指同一个实体同时具有多种形式 x
  • LCD1602和12864简单的介绍

    实验室培训总结1 这个寒假有幸参与到了学校的实验室培训 xff0c 真的是受益良多 xff0c 也学习到了芯片的使用 先讲以下首先学习到了1602的液晶屏的使用 xff0c 驱动一个模块无非就是通过根据所给的时序图进行一系列的编写 xff0
  • msOs

    对ms0S的总结 由于msOS对比51比较难学 xff0c 这里也不太好总结 xff0c 第一印象是就是功能太强大 xff0c 很多寄存器都封装在一个结构体里面 xff0c 方便调用 xff0c 因为这个msOs基于STM32进行改变等待
  • MySQL学习-体系架构

    连接层 最上层 xff08 客户端连接器到连接池这一部分 xff09 是一些客户端和链接服务 xff0c 主要完成一些类似于连接处理 授权认证 及相关的安全方案 服务器也会为安全接入的每个客户端验证它所具有的操作权限 服务层 第二层架构 x
  • 有关显示器的缩放比例和分辨率的设置问题

    今天我们来讨论桌面 显示设置中的这两个功能 缩放比例 xff1a 首先我们要知道计算机的显示器图像的显示是靠底层的发光片来实现的 xff08 每个发光片都是一个像素点 xff09 而大显示器和小显示器每个像素点的大小不同 xff0c 但是如
  • TS快速入门-函数

    在TS里 xff0c 虽然已经支持类 xff0c 命名空间和模块 xff0c 但函数仍然是主要的定义行为的地方 TS中的函数大部分和JS相同 不同之处在于ts会给函数返回值和参数加上类型声明 在TS中 xff0c 函数仍然是最基本 最重要的