typescript学习:function函数,重载

本文内容如下

函数类型

如果你都有了答案,可以忽略本文章,或去TS学习地图寻找更多答案


函数

参数

参数:字符串类型,返回字符串
function sayHello(person:string):string{
    retrun 'hello' + person
}
sayHello('tom') //hello tom


参数:函数类型
function fn(callback: () => void): void {}


可选参数,加?变可选参,放在参数最后
function sayHello(name:string, age?:number):string | number{
    retrun name + age
}
sayHello('tom',18)


默认参数
function sayHello(name:string, age:number = 20):string | number{
    retrun name + age
}
sayHello('tom')


剩余参数
function count(...result:number[]):number{
    let sum = 0;
    for(let i = 0; i < result.length; i++){
        sum += result[i]
    }
    return sum
}
count(1,2,3,4)

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

返回值

void类型:表示函数没有任何返回值
function warn():void{
    alert('warning!!!')
}

有返回值:数字类型
function count():number{
    return 123
}

返回字符串或数字
function count():string | number {
	if(Math.random() > 0.5){
		return 123
	}
	return 'hello ts'
}

函数接收对象的注解

function add({ one, two }: { one: number, two: number }) {
    return one + two
}
const total = add({ one: 1, two: 2 })

this

// 写法一
let deck = {
    suits: ['hearts', 'spades', 'clubs', 'diamonds'],
    cards: Array(52),
    createCardPicker: function () {
        return () => {    //将匿名函数改成箭头函数
            let pickedCard = Math.floor(Math.random() * 52) //0-51
            let pickedSuit = Math.floor(pickedCard / 13)   //0-3

            return {
                suit: this.suits[pickedSuit],
                card: pickedCard % 13 + 1 //0 - 12
            }
        }
    }
}

let cardPicker = deck.createCardPicker()
let pickedCard = cardPicker()

console.log(deck);

console.log('card: ' + pickedCard.card + ' of ' + pickedCard.suit)




// 写法二
interface Card {
    suit: string
    card: number
}

interface Deck {
    suits: string[]
    cards: number[]
    createCardPicker(this: Deck): () => Card
}


let deck: Deck = {
    suits: ['hearts', 'spades', 'clubs', 'diamonds'],
    cards: Array(52),
    createCardPicker: function (this: Deck) {
        return () => {
            let pickedCard = Math.floor(Math.random() * 52) //0-51
            let pickedSuit = Math.floor(pickedCard / 13)   //0-3

            return {
                suit: this.suits[pickedSuit],
                card: pickedCard % 13 + 1 //0 - 12
            }
        }
    }
}

let cardPicker = deck.createCardPicker()
let pickedCard = cardPicker()

console.log(deck);

console.log('card: ' + pickedCard.card + ' of ' + pickedCard.suit)

接口函数

// 通用函数类型:不限参数
type FnType = (...args: any) => any
let fn1: FnType = (name: string, age: number) => name + age


// 接口既函数,等价FnType,写多个函数是接口重载,不常用
interface FnTypeInter1 {
    (...args: any): any
}
let fn2: FnTypeInter1 = (name: string, age: number) => name + age


// 接口是对象的写法,可以写多个
interface FnTypeInter2 {
    eat: (...args: any) => any
}
let fn3: FnTypeInter2['eat'] = (name: string, age: number) => name + age

函数重载

支持同函数名,不同参数的函数同时存在,根据不同的参数,执行不一样的逻辑

多个重载签名 + 实现签名

真正执行的是重载签名,而不是实现签名

优势:

  1. 结构分明
  2. 各司其职,自动提示
  3. 利于功能拓展

例子1

function getInfo(name:string):string
function getInfo(age:number):number
function getInfo(str:any):any{
    if(typeof str === 'string'){
        return '我叫' + str
    }
    return '我的年龄是' + str
}
getInfo(18)    //我的年龄是18
getInfo('tao') //我叫tao

例子2

type MessageType = 'image' | 'audio' | string;

type Message = {
    id: number;
    type: MessageType;
    sendMessage: string;
}

let message: Message[] = [
    { id: 1, type: 'image', sendMessage: 'hello' },
    { id: 2, type: 'audio', sendMessage: 'world' },
    { id: 3, type: 'image', sendMessage: 'react' },
    { id: 4, type: 'audio', sendMessage: 'typescript' },
]

// 非函数重载
function getMessage(value: number | MessageType): Message | Message[] {
    if (typeof value === 'number') {
        return message.find(m => m.id === value) || []
    }
    return message.filter(m => m.type === value) || []
}

// 非函数重载的问题:无法获取对象的属性
const m = getMessage(1)
console.log(m.sendMessage);      //报错,ts没有办法根据传递的值推导出执行的逻辑
const m = <Message>getMessage(1) //限定类型
console.log(m.sendMessage);      //正确


// 使用函数重载实现
function getMessage(id: number): Message
function getMessage(type: MessageType): Message[]
function getMessage(value: number | MessageType): Message | Message[] {
    if (typeof value === 'number') {
        return message.find(m => m.id === value) || []
    }
    return message.filter(m => m.type === value) || []
}

const m = getMessage(1)
console.log(m.sendMessage);


// 修改,增加功能
function getMessage(id: number): Message
function getMessage(type: MessageType, readRecordCount?: number): Message[]
function getMessage(value: number | MessageType, readRecordCount?: number): Message | Message[] {
    if (typeof value === 'number') {
        return message.find(m => m.id === value) || []
    }
    if (readRecordCount) {
        return message.filter(m => m.type === value).splice(0, readRecordCount)
    }
    return message.filter(m => m.type === value)
}

console.log(getMessage('image'));
console.log(getMessage('image', 2)); //只显示几条

方法重载

class ArrayList {
    constructor(public element: Array<object>) { }

    get(id: number) {
        return this.element[id]
    }

    show() {
        this.element.forEach(o => console.log(o))
    }

    remore(id: number): number
    remore(object: object): object
    remore(value: number | object): number | object {
        this.element = this.element.filter((ele, index) => {
            if (typeof value === 'number') {
                return value !== index
            } else {
                return value !== ele
            }
        })
        return value
    }
}


let stuOne = { username: 'li', age: 18 }
let stuTwo = { username: 'tao', age: 28 }
let stuThree = { username: 'joy', age: 38 }

let arr = new ArrayList([stuOne, stuTwo, stuThree])

let remoreIndex = arr.remore(0)
console.log('remoreIndex', remoreIndex);
arr.show()

let remoreObj = arr.remore(stuTwo)
console.log('remoreObj', remoreObj);
arr.show()

构造器重载

type SquareParam = {
    width?: number,
    height?: number,
    raduis?: number
}


class Square {
    public width: number;
    public height: number;

    constructor(width: number, height: number)
    constructor(pramaObj: SquareParam)
    // constructor(value: number | SquareParam) {  //报错 改成any
    constructor(pramaObjOrWidth: any, height?: number) {
        if (pramaObjOrWidth instanceof Object) {
            this.width = (pramaObjOrWidth as SquareParam).width || 0
            this.height = (pramaObjOrWidth as SquareParam).height || 0
        } else {
            this.width = pramaObjOrWidth;
            this.height = height || 0
        }
    }


    public getArea(): number {
        return this.height * this.width
    }
}

let square1 = new Square(40, 50)
console.log('square1', square1.getArea());

let squareObj: SquareParam = { width: 50, height: 90 }
let square2 = new Square(squareObj)
console.log('square2', square2.getArea());

学习更多

TS学习地图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值