前言

今天继续typescript的学习,开始函数的学习。

函数

函数的定义

和JavaScript一样,TypeScript函数可以创建有名字的函数和匿名函数。 你可以随意选择适合应用程序的方式,不论是定义一系列API函数还是只使用一次的函数。

定义有名字的函数:

function fn(){
return 123;
}
console.log(fn())

定义匿名函数:

let fn1 = function(){
return 456;
}
console.log(fn1())

函数定义类型

函数类型包含两个部分:参数类型和返回值类型。当写出完整函数的时候,两部分类型都是需要的。我们需要给每个参数添加类型之后再为函数本身添加返回值类型。

function fn3(name:string,age:number):string{
return `${name}的年龄是${age}岁`
}
console.log(fn3('小明',25))

如果函数没有返回值,那么函数返回值类型是void

function fn4():void{
console.log('这是一个没有返回值的函数')
}
console.log(fn4())

可选参数

在javascript中,函数的实参和形参可以不一致,也就是说实参的个数和形参的个数可以不相同。比如:下面的函数形参要求两个参数,但是实参只传递了一个参数。这种情况在js中不会报错。

function fn5(name,age){
console.log(`${name}的年龄是${age}`)
} fn5('小红')

但是在ts中,实参个数和形参个数必须一致。如果不一样就需要配置可选参数。将没有传入的参数设置为可选参数。通过在可传可不传的参数类型前面加上?表示该参数为可选参数。

function fn5(name:string,age?:number):void{
if(age){
console.log(`${name}的年龄是${age}`);
}else{
console.log(`${name}`);
}
}
fn5('小红')
fn5('小红',20)

注意:可选参数最好放到参数最后面

默认参数

在ES6中我们可以在参数后面直接设置默认参数

function fn6(name, age = 40) {
if (age) {
console.log(name + "\u7684\u5E74\u9F84\u662F" + age);
}
else {
console.log("" + name);
}
}
fn6('小红');
fn6('小红', 20);

同样在ts中,我们可以在参数类型后面设置默认参数:

function fn6(name:string,age:number = 50):void{
if(age){
console.log(`${name}的年龄是${age}`);
}else{
console.log(`${name}`);
}
}
fn6('小明')
fn6('小明',20)

剩余参数

在前面我们知道在ts中,形参的个数和实参的个数必须是一致的。但是有些情况下我们并不知道实参个数究竟是多少。实参的个数有可能取决于用户的输入。我们不可能每次都根据实参的个数来修改用户的输入。比如:计算多个数的和:

function sum(a:number,b:number,c:number):number{
return a + b + c;
}
console.log(sum(1,2,3))
console.log(sum(1,2,3,4))
console.log(sum(1,2,3,4,5))

我们可以观察到:用户可能需要求得是三个数的和,也可能需要求得是四个数的和。也可能需要求得是五个数的和。我们不能可能每次都根据用户的输入来修改形参的个数。在js中我们通过arguments来收集所有的参数。arguments是一个伪数组。在ts中我们同样通过一个数组来收集所有的参数。只不过这个数组编译器会帮助我们创建。名字是...后面的变量名字。

function sum(a:number,...rest:number[]):number{
let sum = 0;
for(let i = 0;i < rest.length;i++){
sum += rest[i]
}
return sum;
}
console.log(sum(1,2,3))
console.log(sum(1,2,3,4))
console.log(sum(1,2,3,4,5))

函数的重载

JavaScript本身是个动态语言。 JavaScript里函数根据传入不同的参数而返回不同类型的数据是很常见的。比如:

const person1 = {
name:'小明',
age:24,
sex:'男'
}
const person2 = ['小红',26,'女']
function info(person){
// 判断传递进来的参数类型
if(Array.isArray(person) == true){
//如果是数组...
console.log(`${person[0]}的年龄是${person[1]}性别是${person[2]}`)
}else{
//如果是对象...
console.log(`${person.name}的年龄是${person.age}性别是${person.sex}`)
}
}
console.log(fn7(person1))
console.log(fn7(person2))

info函数会根据传递进来的参数类型,来进行相应的操作。ts中重载的实现是通过为同一个函数提供

多个函数类型定义来进行函数重载。

function fn7(person:[string,number,string]):string;  // 第一个函数类型定义
function fn7(person:object):string;// 第二个函数类型定义
function fn7(person:any):any{
// 判断传递进来的参数类型
if(Array.isArray(person) == true){
//如果是数组...
console.log(`${person[0]}的年龄是${person[1]}性别是${person[2]}`)
}else{
//如果是对象...
console.log(`${person.name}的年龄是${person.age}性别是${person.sex}`)
}
}
console.log(fn7(person1))
console.log(fn7(person2))

Typescript基础(2)——函数的更多相关文章

  1. TypeScript基础以及在Vue中的应用

    TypeScript推出已经很长时间了,在Angular项目中开发比较普遍,随着Vue 3.0的即将推出,TypeScript在Vue项目中使用也即将成为很大的趋势,笔者也是最近才开始研究如何在Vue ...

  2. python基础——匿名函数

    python基础——匿名函数 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便.  在Python中,对匿名函数提供了有限支持.还是以map()函数为例,计算f(x)=x2时 ...

  3. python基础——返回函数

    python基础——返回函数 函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回.  我们来实现一个可变参数的求和.通常情况下,求和的函数是这样定义的: def calc_ ...

  4. python基础——sorted()函数

    python基础——sorted()函数 排序算法 排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个d ...

  5. python基础——filter函数

    python基础——filter函数 Python内建的filter()函数用于过滤序列. 和map()类似,filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函 ...

  6. Java之--Java语言基础组成—函数

    Java语言基础组成-函数 Java语言由8个模块构成,分别为:关键字.标识符(包名.类名.接口名.常量名.变量名等).注释.常量和变量.运算符.语句.函数.数组. 本片主要介绍Java中的函数,函数 ...

  7. 数据分析与展示——Matplotlib基础绘图函数示例

    Matplotlib库入门 Matplotlib基础绘图函数示例 pyplot基础图表函数概述 函数 说明 plt.plot(x,y,fmt, ...) 绘制一个坐标图 plt.boxplot(dat ...

  8. JavaSE语法基础(3)---函数、数组

    JavaSE语法基础(3)---函数.数组 函数的概念:实现特定功能的一段代码,可反复使用. 函数的出现减少代码冗余,提高代码的复用性,可读性,可维护性,可以使每个功能模块独立起来,方便分工合作. 函 ...

  9. python基础——匿名函数及递归函数

    python基础--匿名函数及递归函数 1 匿名函数语法 匿名函数lambda x: x * x实际上就是: def f(x): return x * x 关键字lambda表示匿名函数,冒号前面的x ...

随机推荐

  1. Add an Editor to a Detail View 将编辑器添加到详细信息视图

    In this lesson, you will learn how to add an editor to a Detail View. For this purpose, the Departme ...

  2. Cesium专栏-空间分析之坡向分析(附源码下载)

    Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...

  3. 【转】【好文章】更愉快的写css

    我在写CSS的时候经常会碰到些麻烦事儿: 1)看上去蛮简单的排版却写了很久 2)代码写的越来越散,总是这里补一句,那里补一句,没有条理性 3)margin.padding.font-size等属性在不 ...

  4. jQuery的延迟对象(十一)

    在前端这个领域里面,ajax请求非常常见. // 前提引入jquery $.ajax({ type: 'get', url: '/path/to/data', success: function (r ...

  5. rowKey原则

    rowKey设计原则 1.长度原则 最大值为64KB, 长度在10 ~ 100byte ; 最好是 8 的倍数,太长会影响性能: 2.唯一原则 具有唯一性: 3.散列原则 1).盐值散列:不能使用时间 ...

  6. WPF 精修篇 DataGrid 数据源排序

    原文:WPF 精修篇 DataGrid 数据源排序 效果 <DataGrid x:Name="datagrid" ItemsSource="{Binding Ele ...

  7. IDEA2019 Win10 Tomcat Server控制台中文乱码的快速解决办法

    原理 Windows10的控制台使用GBK编码,而Tomcat使用UTF-8编码,导致乱码 解决办法 修改$tomcat/conf/logging.properties文件 # 注释这行 java.u ...

  8. Eclipse优化之设置不自动弹出控制台和Server

    有时候Eclipse启动,控制台console不会自动跳出来,需要手工点击该选项卡才行, 按下面的设置,可以让它自动跳出来(或不跳出来): windows  ->   preferences   ...

  9. Python程序中的进程操作-进程同步(multiprocess.Lock)

    目录 一.多进程抢占输出资源 二.使用锁维护执行顺序 三.多进程同时抢购余票 四.使用锁来保证数据安全 通过刚刚的学习,我们千方百计实现了程序的异步,让多个任务可以同时在几个进程中并发处理,他们之间的 ...

  10. Windows许可证 即将过期

    最近打开电脑,系统总是自动弹出Windows许可证即将过期的弹窗,现在总结方法如下. 命令都是在运行窗口输入的打开方式:win+R组合键或者右键点击win10开始菜单,点击“运行”查看系统版本:win ...