TypeScript--4.函数

函数在各个语言里用的太多了,就不赘述,只讨论一下TypeScript的函数跟JS的函数不同的地方.

1.函数类型

TypeScript里的函数需要给参数和返回值都指定类型,它能够根据返回语句,自动判断返回值类型,通常都可以省略

function add(x: number, y: number):number{    
    return x + y;
}
console.log(add(1, 2));

接下来看一下函数的完整类型,参数类型和返回值类型用=>隔开

let myAdd: (x:number, y:number)=>number = 
function(x: number, y: number): number { return x+y; };

2.可选参数和默认参数

当参数可传可不传的时候,就可以在对应的参数名旁边加上?修饰,实现可选参数功能,如果没传值,对应形参值是undefined.要把可选的参数放到参数最后面

function buildName(firstName: string, lastName?: string){
    console.log(firstName + " " + lastName);
}
buildName("龙哥");
buildName("东旭", "龙哥");

默认参数在ES6之后,JS的函数也能设置.

function buildName(firstName: string, lastName = "赵") { 
    return firstName + " " + lastName;
}

3.剩余参数 Rest参数

这个也是ES6里新出现的特性,在JS里有一个非常重要的对象arguments,即使不写形参,也可以通过arguments获取到形参内容.剩余参数会被当做个数不限的可选参数,可以一个都没有,同样也可以有任意个.编译器创建参数数组,名字是你在省略号( ... )后面给定的名字,你可以在函数体内使用这个数组.

function buildName(firstName: string, ...restOfName: string[]) {
    console.log(restOfName);
}
buildName("赵", "钱", "孙", "李");

4.this和箭头函数

在JS里,this的使用对于很多初学者来说,会出很多问题,很多问题都出现在this的指向,如果真出问题,大家可以先打印一下this的指向,看一个例子

let deck = {    
    name: ["宋江", "卢俊义", "吴用", "公孙胜"],    
    test: function() {        
        return function() {            
            let num1 = Math.floor(Math.random() * 52);            
            let num2 = Math.floor(num1 / 13);            
            console.log(this.name);            
            return {suit: this.name[num2], card: num1 % 13};        }    
    }
}
let cardPicker = deck.test();
let pickedCard = cardPicker();
console.log(pickedCard);

这里打印出来suit的内容是undefined,原因就是出现在this的问题,这里的this实际上指代的是window,因为deck是window的变量,window上没有name的变量,所以当取值的时候,就是undefined,还是this指向的问题.ES6里,可以使用箭头函数来解决这种指代.箭头函数能报错函数创建时候的this,而不是调用时候的this

let deck = {    
    name: ["宋江", "卢俊义", "吴用", "公孙胜"],    
    test: function() {        
        return ()=> {            
            let num1 = Math.floor(Math.random() * 52);            
            let num2 = Math.floor(num1 / 13);            
            console.log(this.name);            
            return {suit: this.name[num2], card: num1 % 13};        }    
    }
}

TypeScript里的对象,属性都有对应类型,可以在接口里设置this的类型,上述例子里的this对应的都是any类型,通过类型也能避免指向问题

interface Deck {    
    suits: string[];   
    test(this: Deck)=>Deck;
}
let deck: Deck = {    
    suits:["宋江", "卢俊义", "吴用", "公孙胜"],    
    test: function(this: Deck) {        
    return () => {            
        let num1 = Math.floor(Math.random() * 52);           
        let num2 = Math.floor(num1 / 13);            
        return {suit: this.name[num2], card: num1 % 13};        
      }    
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 概述 TypeScript本质上是向JavaScript语言添加了可选的静态类型和基于类的面向对象编程,同时也支持...
    oWSQo阅读 8,684评论 1 45
  • 以下内容是我在学习和研究ES6时,对ES6的特性、重点和注意事项的提取、精练和总结,可以做为ES6特性的字典;在本...
    科研者阅读 3,282评论 2 9
  • 慕课网@JoJozhai 老师 TypeScript入门课程分享 TypeScript入门 ES5,ES6,JS,...
    shangpudxd阅读 10,642评论 0 22
  • 有效果的  没效果的
    plantAtree_dAp阅读 2,899评论 0 0
  • 眼神。 动人的又小心翼翼的眼眸,无需隐藏。 想隐藏的东西又太多,甚至有时候是自己。但是还好,我们的眼眸可以说出心里...
    枝楼阅读 964评论 0 0

友情链接更多精彩内容