Typescript 基础(二)之函数

智数漫游者说
• 阅读 1449

Typescript 中的函数

Javascrip 中函数是一等公民
一、Javascript 中的两种常见的定义函数的方式
1、函数声明

function myFunc(x,y){
    return x+y
}

2、函数表达式

let addFunc = function(x,y){
    return x-y
}

二、Typescript 中定义函数可同时定义函数接收的参数类型和函数的返回值类型

function myFuncTs (x:number,y:number):number {
    return x+y
}
let result = myFuncTs(12,13)

当函数的返回值类型没有指定时,typescript 会自动根据函数返回值推断返回类型

可以使用接口来定义一个函数需要符合的形状,如:

interface addFuncInteface{
    (x:number,y:number):number
}
let addF : addFuncInteface = (left:number,right:number)=>{ return left + right }

三、可选参数
JavaScript里,函数的每个参数都是可选的,可传可不传。 没传参的时候,它的值就是undefined。在Typescript 中可以用 ? 定义函数的可选参数,需要注意的是,可选参数必须在必须参数之后,否则报错。
下面的例子中,name 参数是可选参数,可传可不传。

interface callbackInterface{
    (result:any):void
}
function canChoiceParames(width:number,height:number,callback:callbackInterface,name?:string):object {
    let tempObj = {
        w:width,
        h:height,
    }
    callback(tempObj)
    return tempObj
}
 let res = canChoiceParames(100,200,function(res){
    
},'myName')

四、默认参数
与可选参数不同的是,带默认值的参数不需要放在必须参数的后面
下面的例子中 height 参数默认100

function defaultParams(width:number,height:number = 100){
}

五、剩余参数
必要参数和默认参数有一个共同点:他们都只表示某一个参数。但是有时候会有同时操作多个参数的需求,或者你并不知道会有多少个参数会传进来。在JavaScript里,你可以使用 arguments来访问所有传入的参数。在Typescript 中可以把所有参数、或者某部分参数收集到一个变量里。注意剩余参数只能是最后一个参数。

function buildName(firstName: string, ...restOfName: string[]) {
  return firstName + " " + restOfName.join(" ");
}

let employeeName = buildName("Joseph", "Samuel", "Lucas", "MacKinzie");

上面的例子中restOfName参数为一个包含了剩余参数的数组,该数组为["Samuel", "Lucas", "MacKinzie"]
六、函数重载
当函数入参使用联合类型同时返回值也有有多种类型时,函数重载允许对函数接受不同参数的数量和类型时作出不同的处理。
比如实现一个反转函数,输入为数字类型123时输出321,输入字符串类型 abc 时输出 cba
利用联合类型,该需求实现如下

function reverse(x: number | string): number | string {
    if (typeof x === 'number') {
        return Number(x.toString().split('').reverse().join(''));
    } else if (typeof x === 'string') {
        return x.split('').reverse().join('');
    }else{
        return x
    }
}

这样虽然能实现需求,但是函数参数与返回值的说明不够直观。调用者容易迷惑,当传入函数的参数类型为number 时返回值的类型究竟是 number 还是string。
函数重载可以解答这样的疑惑,使函数的类型定义表达更加直观。

function reverse(x: number): number;
function reverse(x: string): string;
function reverse(x: number | string): number | string {
    if (typeof x === 'number') {
        return Number(x.toString().split('').reverse().join(''));
    } else if (typeof x === 'string') {
        return x.split('').reverse().join('');
    }else {
        return x
    }
}

前面两个reverse 是函数声明,最后一个reverse 是函数实现,有参数类型和返回值类型随意搭配的意思。前面两个 reverse 对函数进行了声明,第一个reverse声明的内容为,当传入函数的参数类型为number 时,函数返回值类型为number 类型;第二个 reverse 声明的内容为,当传入函数的参数类型为string 时,函数返回值类型为string。
下面是另一个例子,动手试一下吧。
同样的,前面几个testOverload为函数声明,最后一个testOverload为函数实现:

function testOverload(x:string,y:boolean):number;
function testOverload(x:string,y:number):string;
function testOverload(x:number,y:number):string;
function testOverload(x:number,y:boolean):number;
function testOverload(x:string | number, y:number|boolean) :string | number  {
    return x
}
let o1 = testOverload('string',false); // 此时 o1 类型为numer,鼠标移动到 o1 变量上可看到类型
let o2 = testOverload('string',10);// 此时 o2 类型为string,鼠标移动到 o2 变量上可看到类型
let o3 = testOverload(12,10);// 此时 o2 类型为string,鼠标移动到 o2 变量上可看到类型
let o4 = testOverload(13,true);// 此时 o2 number,鼠标移动到 o2 变量上可看到类型
点赞
收藏
评论区
推荐文章
九路 九路
4年前
Go 函数是“一等公民”的理解
函数(function)作为现代编程语言的基本语法元素存在于支持各种范式(paradigm)的主流编程语言当中。无论是命令式语言C、多范式通用编程语言C,还是面向对象编程语言Java、Ruby,亦或是函数式语言Haskell、动态脚本语言Python、PHP、JavaScript,函数这一语法元素都是当仁不让的核心。Go语言以“成为新一代系统
Karen110 Karen110
4年前
一篇文章带你了解JavaScript作用域
在JavaScript中,对象和函数也是变量。在JavaScript中,作用域是你可以访问的变量、对象和函数的集合。JavaScript有函数作用域:这个作用域在函数内变化。一、本地JavaScript变量一个变量声明在JavaScript函数内部,成为函数的局部变量。局部变量有局部作用域:它们只能在函数中访问。JS://codeherecann
小嫌 小嫌
4年前
Javascript中的变量提升
定义JavaScript中奇怪的一点是你可以在变量和函数声明之前使用它们。就好像是变量声明和函数声明被提升了代码的顶部一样。sayHi()//Hithere!functionsayHi()console.log('Hithere!')name'JohnDoe'console.log(name)//JohnDoevarn
九旬 九旬
3年前
函数参数传递
函数参数传递在JavaScript中函数传参,分为两种:基础类型(Number、String、Boolean..)引用类型(Object、Array、Funcion..)基础类型传参看下面的例子:js
Stella981 Stella981
4年前
Python嵌套函数 闭包
1\.什么是嵌套函数  嵌套函数就是在函数中定义函数,英文叫nestedfunctiondef outer(x):    def inner():        print(x)    inner()这也很好理解,在函数outer中定义了另外一个函数inner,而inner也必须在outer
Easter79 Easter79
4年前
TypeScript学习笔记
TypeScript学习笔记TypeScript是JavaScript的超集,任何合法的JS程序都是合法的TypeScript程序TypeScript通过向JavaScript增加可选的静态类型声明来把JavaScript变成强类型程序语言。静态类型声明可约束函数、变量、属性等程序实体。TypeScript语言内
Stella981 Stella981
4年前
JavaScript之函数
    玩js自然要和函数打交到。函数嘛简单来说就是给代码分个块,方便调用、信息隐藏和代码复用,还可以用于指定对象的行为。另外函数还可以玩出很多花样来。。。JavaScript使用关键字function定义函数。定义一个函数://函数声明//这种定义函数的好处是可以在当前作用域内任何位置调用,因为变量的声明和函数的
Wesley13 Wesley13
4年前
JS中的匿名函数自执行、函数声明与函数表达式
先看一段jQuery源码中匿名函数自执行的例子:(function(window,undefined){//jquerycode})(window);另外一种常见的写法:function($){//jquerycode})(window
Stella981 Stella981
4年前
JavaScript学习总结(3)——JavaScript函数(function)
一、函数基本概念  为完成某一功能的程序指令(语句)的集合,称为函数。二、JavaScript函数的分类  1、自定义函数(我们自己编写的函数),如:functionfunName(){}  2、系统函数(JavaScript自带的函数),如alert函数。三、函数的调用方式
可莉 可莉
4年前
04. react 初次见面
    组件从概念上看就像是函数,它可以接收任意的输入值(称之为“props”),并返回一个需要在页面上展示的React元素。1、组件定义的两种方式1.1函数定义组件  定义一个组件最简单的方式是使用JavaScript函数:functionWelcome(props){return<
Stella981 Stella981
4年前
JavaScript函数式编程,“香”吗?
总说函数是JavaScript的一等公民,很多人就问了,它凭什么?其实凭的就是对于JS这种没有明确归类的“多范式语言”,函数式编程拥有着天然的优势。在JS里,函数本身就被视作对象,可以有属性,能作为参数传给函数,也能作为函数的返回结果,十分便利。而这种特性对于代码日益庞大,业务逻辑逐渐复杂的前端来说称得上是至关重要。