TS语法三 函数和泛型

一 TS中的函数

TS中的函数主要包括以下几个方面:
(1)函数类型

  • 使用接口定义函数类型
  • 使用类型别名

(2)参数

  • 可选参数
  • 默认参数
  • 剩余参数

(3)重载

1.定义函数类型
//(1)使用类型别名定义函数类型
type Adder = (x:number, y:number) => number
let adder:Adder = (arg1:number ,arg2:number) => arg1+arg2  //let add2:Adder = (arg1 ,arg2) => arg1+arg2 也是可以的
//(2)使用接口定义函数类型
interface Adder1 {
    (x:number, y:number) : number
}
let adder1:Adder1 = (arg1:number ,arg2:number) => arg1+arg2
2.函数参数
//(1)可选参数,必须在最后一个参数上
type addFun = (arg1:number,arg2:number,arg3?:number) => number   
let add3:addFun = (x:number,y:number, z:number=4) => x+y+z  //这里第三个参数用了默认参数
console.log(add3(1,2))  //7

let add6 = (x:number, y:number, z?:number):number => x+y
console.log('add6',add6(1,2)) //3

//(2)默认参数
let add4 = (x:number , y:number=2):number => x+y
console.log(add4(1))  //3

//(3)剩余参数
const add5 =(arg1:number, ...args:number[]) =>{
    // ...
}
3.函数重载
function toArray(value:number):number[]
function toArray(value:string):string[]
function toArray(value: number | string) {
    if(typeof value === 'string') {
      return value.split("")
    }else {
      return value.toString().split("").map(item => Number(item))
    }
}
const r = toArray(123);

二 泛型

  • 简单实用
  • 泛型变量
  • 泛型约束
  • 在泛型约束中使用类型参数

先看一个不用泛型的例子:

const getArray = (value:any, times:number=5):any[] => {
    return new Array(times).fill(value)
}

console.log(getArray('abc')) //['abc', 'abc', 'abc', 'abc', 'abc']

这里value的类型就是返回的数组的每个数据的类型,如果两边的数据类型需要统一的话,就可以用泛型来解决。

const getArray1 = <T>(value:T, times:number=5):T[] => {
    return new Array(times).fill(value)
}

console.log(getArray1<number>(4)) //[4, 4, 4, 4, 4]
// console.log(getArray1<number>('abc'))  //报错,传入的参数必须是number类型

其他例子:

//2.多个泛型
const getArray2 = <T, U>(param1:T, param2: U,times: number=5): (T | U)[] =>{
    return new Array(times).fill([param1,param2])
}
console.log(getArray2(2,'abc'))  //[Array(2), Array(2), Array(2), Array(2), Array(2)]  其中Array(2)里是[2, 'abc']

//3.定义泛型的函数类型
type getArrayFunc = <T>(arg:T, times:number) => T[]
let getArray4:getArrayFunc = (arg:any,times:number) =>{  //这里的arg定义成any即可。
    return new Array(times).fill(arg)
}

console.log(getArray4('abc',3))

//4.泛型的继承
interface checkLength {
    length: number
}

type getArrayFunc1 = <T extends checkLength>(arg:T, times:number) => T[]
let getArray5:getArrayFunc1 = (arg:any,times:number) =>{  
    return new Array(times).fill(arg)
}
console.log(getArray5({length:3},2))  //[{length:3},{length:3}]

const getProps = <T, K extends keyof T>(obj: T, propName: K) => {
    return obj[propName]
}
const obj = {
    a:'qqq',
    b:'www'
}

console.log(getProps(obj,'a'))   //qqq
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值