TypeScript的函数

news2024/12/26 22:32:14

ts与js函数区别

tsjs
传参需要规定类型无类型
箭头函数箭头函数ES6
函数类型无函数类型
必填和可选参数所有参数都是可选的
能设置默认参数能设置默认参数
剩余参数剩余参数

函数重载

函数重载

注释

TypeScript 允许您指定函数的输入和输出值的类型。

输入值注释

// 传参必须为字符串
function greet(name:string){
    ...
}

输出值注释

// 返回值必须为数字
function greet():number {
  return 30
}

箭头函数

跟js用法一样

myBooks.forEach(() => console.log('reading'));

函数类型

我们在前面说过,如果函数的传参也是函数,我们可以这样定义传参的类型

function cat(fn: Function) {
    fn();
}
cat(function(){console.log('我是一只猫')})

那么,如果我们需要定义传参函数的函数类型呢?(比如不返回void,返回数字number等)

function cat1(fn:() => void) {
    fn();
}
cat1(function():void{console.log('我是一只猫')}) 

如果我们修改一下传参的类型

此时报错,因为传入的函数并不是返回number,而是void类型。

这样也会报错。

骗不了一点,连函数内部都会进行检测。 

let customFn: (name: string, nums: number) => string;

对入参做类型限制,并对函数类型限制

function createUserId(name: string, id: number): string {
  return name + id;
}

也可以像上面这么写。

可选参数

TypeScript里的每个函数都是必须的。

编译器检查用户是否为每个参数都传入了值。当然啦,你想传入undefined或null也是可以的。

简短的说,传递给一个函数的参数个数必须与函数期望的参数个数一致。

JavaScript里,每个参数都是可选的,可传可不传。没有传参的时候,它的值就是undefined。

在TS里,如果我们想实现可选参数,可以在参数名旁使用?实现可选参数的功能。

function dbbb(name:string,id?:number){}
dbbb('d')

可选参数必须跟在必须参数后面。就是id是可选参数,那么它必须放在name后面。

那么如果只有一个可选参数呢?

function d1(name?:string){}
d1()

不会报错,可行。不传name,TS也会像JS一样把传参当做undefined、

跟在TypeScript里,我们也可以为参数提供一个默认值。跟JS一样

function myName(firstName: string, lastName = "Smith") {}

剩余参数

有时,你想同时操作多个参数,或者你并不知道会有多少参数传递进来。在javaScript里,你可以使用arguments来访问所有传入的参数。

JS的剩余参数:

function f(a, b, ...abc) {
	// ...
}

如果函数的最后一个命名参数以...为前缀,则它将成为一个由剩余参数组成的真数组。

所以说剩余参数是个数组,它即使没有值,也是以一个空数组形式存在。

js还存在一个arguments的概念。arguments 对象包含了传给函数的所有实参。此对象包含传递给函数的每个参数的条目。它是一个类数组对象,但不是数组,具体看这篇推文。

箭头函数没有 arguments,所以我们可以使用剩余参数替代 arguments 获取实际参数

TS的剩余参数:

在TypeScript里,你可以把所有参数收集到一个变量里:

function push(array, ...items) {
  items.forEach(function (item) {
    array.push(item);
  });
}

let a = [];
push(a, 1, 2, 3);

如上例。我们实现了在函数内部用array传参收集了用户所有的传参。 

剩余参数会被当做个数不限的可选参数。可以一个都没有。

函数重载

看这篇推文,觉得已经讲得很详细很容易理解,特别值得一读。以下是对该博文的备注。

TS 函数重载你还不会?来!我教你_ts 重载_韩振方的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/fang_my/article/details/129003386博文有一些地方可能刚接触TS的朋友会看不懂,我把它简要描述一下:

interface resObj {
    name:string
}
function f(a:string | string[]):resObj | resObj[] {
    if (typeof a === 'string') {
        return {name:'abc'} as resObj;
    }else {
        return [{name:'abc'},{name:'bcd'}] as resObj[]
    }
}
let data:resObj[];
data = f (['a','b'])

这样子是会报错的。

TS 目前只知道你的参数只有两个类型,你的返回值只有两个类型,但是它不知道你的参数对应的你想返回哪个类型 。

正确写法。利用函数重载:

function f(a:string):resObj 
function f(a:string[]):resObj[] 
function f(a:string | string[]):resObj | resObj[] {
    if (typeof a === 'string') {
        return {name:'abc'} as resObj;
    }else {
        return [{name:'abc'},{name:'bcd'}] as resObj[]
    }
}
let data:resObj[];
data = f (['a','b'])

甚至于你不写断言都行:

function f(a:string):resObj 
function f(a:string[]):resObj[] 
function f(a:string | string[]):resObj | resObj[] {
    if (typeof a === 'string') {
        return {name:'abc'} 
    }else {
        return [{name:'abc'},{name:'bcd'}]
    }
}
let data:resObj[];
data = f (['a','b'])

在TS中,类也可以进行方法重载。

class Calculator {
  add(a: number, b: number): number;
  add(a: string, b: string): string;
  add(a: string, b: number): string;
  add(a: number, b: string): string;
  add(a: Combinable, b: Combinable) {
    if (typeof a === "string" || typeof b === "string") {
      return a.toString() + b.toString();
    }
    return a + b;
  }
}

const calculator = new Calculator();
const result = calculator.add("Semlinker", " Kakuqo");

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

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

相关文章

如何理解图神经网络的傅里叶变换和图卷积

图神经网络(GNN)代表了一类强大的深度神经网络架构。在一个日益互联的世界里,因为信息的联通性,大部分的信息可以被建模为图。例如,化合物中的原子是节点,它们之间的键是边。图神经网络的美妙之处在于它们能…

【设计模式】二、UML 类图概述

文章目录 常见含义含义依赖关系(Dependence)泛化关系(Generalization)实现关系(Implementation)关联关系(Association)聚合关系(Aggregation)组合关系&#x…

【赠书活动】AI 时代,程序员无需焦虑

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

9.8day59

503. 下一个更大元素 II - 力扣(LeetCode) 知识点:单调栈 42. 接雨水 - 力扣(LeetCode)

初学python爬虫学习笔记——爬取网页中小说标题

初学python爬虫学习笔记——爬取网页中小说标题 一、要爬取的网站小说如下图 二、打开网页的“检查”,查看html页面 发现每个标题是列表下的一个个超链接,从183.html到869.html 可以使用for循环依次得到: x range(183,600) for i in x:pr…

NoSQL数据库入门

一、NoSQL数据库概述 NoSQL 是一种不同于关系数据库的数据库管理系统设计方式,是对非关系型数据库的统称,它所采用的数据模型并非传统关系数据库的关系模型,而是类似键/值、列族、文档等非关系模型。NoSQL 数据库没有固定的表结构&#xff0c…

W25Q16_Flash手册总结

文章目录 前言一、概述&特点1、概述W25Q16BV1、特点2、引脚说明3、内部结构示意图4、操作指令5、操作示例时序图1、写入启用指令:Write Enable(06h)2、读取状态寄存器指令:Read Status Register-1(05h)…

【PowerShell代码】清除掉文件中的非英文字母

如果你尝试从网上下载一些带有非ASCII的文件时候,你在这台机器上会发现没有问题,但是将文件传递到其他的地方或者其他电脑你会发现存在比较大的问题,我如何才能将这些文件中的非英文字母去掉呢? 如何才能将文件中的这些非英文字母…

无涯教程-JavaScript - IMLOG2函数

描述 IMLOG2函数以x yi或x yj文本格式返回复数的以2为底的对数。可以从自然对数计算复数的以2为底的对数,如下所示- $$\log_2(x yi)(log_2e)\ln(x yi)$$ 语法 IMLOG2 (inumber)争论 Argument描述Required/OptionalInumberA complex number for which you want the bas…

为什么零基础选择语言首选python

在众多编程语言中,似乎已经没有什么能够阻挡Python的步伐。本月Python又是第一名,市场份额达到了13.42%,在2023年,Python已经连续7个月蝉联榜首,遥遥领先于其他对手。 每个月榜单发布后,都有小伙伴会好奇&…

Blender中的高级边缘控制和纹理映射

推荐:使用 NSDT场景编辑器 快速搭建3D应用场景 步骤 1 首先,您需要创建一组无阴影材质,每种材质具有不同的颜色,确保您有足够的材质来覆盖模型,而不会有相同的颜色相互重叠。然后,切换到“着色”&#xff…

即拼七人拼团系统开发模式是怎么盈利赚钱的?

即拼七人拼团是市场上最近比较火爆的一款商业模式,它结合了二二复制和拼团两种模式玩法,不仅能让消费者从中获利,还能让平台快速获流裂变,对平台起盘初期和发展中期具有很强的推广能力。那么这个模式是怎么盈利赚钱的呢&#xff1…

使用内网负载机(Linux)执行Jmeter性能测试

一、背景 ​ 在我们工作中有时候会需要使用客户提供的内网负载机进行性能测试,一般在什么情况下我们需要要求客户提供内网负载机进行性能测试呢? 遇到公网环境下性能测试达到了带宽瓶颈。那么这时,我们就需要考虑在内网环境负载机下来执行我们…

Mac brew -v 报错 fatal: detected dubious ownership in repository

Mac 电脑查询 brew版本时报错,如下错误: Last login: Fri Sep 8 14:56:21 on ttys021 sunshiyusunshiyudeMacBook-Pro-2 ~ % brew -v Homebrew 4.0.3-30-g7ac31f7 fatal: detected dubious ownership in repository at /usr/local/Homebrew/Library/Ta…

《人生苦短,我学Python》——列表(List)

昨天,我们学习了一种数据结构——元组。今天我们将学习另一种数据结构——列表。 列表又叫List,与元组的结构类似,也可以用于存储多个类型的数据。接下来,我们一起学习列表的用法–> 文章目录 一、要点先知:二、基…

喊山(数据结构习题)

喊山,是人双手围在嘴边成喇叭状,对着远方高山发出“喂—喂喂—喂喂喂……”的呼唤。呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的“讯号”,达到声讯传递交流的目的。原来它是彝族先…

DeU-Net: 用于三维心脏mri视频分割的可变形(Deformable)U-Net

论文链接:https://arxiv.org/abs/2007.06341 代码链接:文章都看完了实在找不到代码!好崩溃!好崩溃!已经发邮件联系作者! 摘要 心脏磁共振成像(MRI)的自动分割促进了临床应用中高效、准确的体积测量。然而…

企业密码安全:ADSelfService Plus 提升密码管理的千里之行

在当今数字化时代,企业的密码安全变得至关重要。密码是保护企业敏感信息和数据的第一道防线,而有效的密码管理对于确保网络安全至关重要。ADSelfService Plus是一款强大的密码管理和自助服务解决方案,它在提供密码安全方面走在了前沿。 ADSel…

动态表单设计

动态表单设计 背景方案讨论基于上面分析,对比调研,自定义动态表单数据模型表单详解(一) 表单模板:jim_dynamic_form(二)表单数据类型:jim_form_data_type(三)…

前端面试经典题--页面布局

题目 假设高度已知&#xff0c;请写出三栏布局&#xff0c;其中左、右栏宽度各为300px&#xff0c;中间自适应。 五种解决方式代码 浮动解决方式 绝对定位解决方式 flexbox解决方式 表格布局 网格布局 源代码 <!DOCTYPE html> <html lang"en"> <…