4、TS函数的类型

函数中的类型

1:函数的声明方式
2:函数的参数
3:函数的返回值
前言:

  • function关键字来声明的函数可以提升到当前作用域顶部
  • 对于ts来说 function关键和const add1=function有区别, function关键字声明的函数 不能标注函数类型
  • 通过表达式来申明的函数:必须赋予的值要满足定义的类型(要求有一个兼容性在里面)

一、函数的定义:(x: any, y: any) => any | { (x: any, y: any): any }

// type Add = (x: any, y: any) => any;
 type Add ={ (x: any, y: any): any };
 const sum: Add = function (x:string,y:string) {
     return x + y;
 }
 //如果表明函数类型,再使用的时候以表明的函数为准

二、参数 :可选参数 ?是可选参数和 string | undefined 必须得传参,可选参数只能在列表参数的后面

=是默认值 y:string=‘1’ y?:string

  • 例如:y?:string y:string | undefined
//const sum = function和const sum: Add = function (x:string,y:string)的区别是一样的
//sum = function可推导出类型,
//type Add ={ (x: string, y: string): string };
const sum = function (x:string,y:string='1') {
    return x + y;
}
//这里如果是兼容处理,采用的是默认值的方式,不是你赋值的类型  type Add ={ (x: string, y?: string): string };
sum('1')

三、参数this问题

尽量不采用this 来作为函数的上下文,this的缺陷就是类型推导问题

  • 如果想限制this的类型,那么需要手动指定this类型

function getValue(this:IPerson,key:Ikeys) {    //this不是形参,是标明参数的类型
    // return this[key];
    return 1
}
//我想根据值来 获取类型 typeof  配合type来声明新的类型
const person = {name: 'jack', age: 18,address:'邯郸大名'}

type IPerson = typeof person;//提取对象的类型为IPerson type类型会提升到顶部

type Ikeys = keyof IPerson;//提取对象的key为Ikey

//可以将子类型赋予给父类型  子类型:IPerson  父类型:{name:string,age:number}
getValue.call(person, 'name');

函数中有arguments 但是我们不建议使用

// 函数编程:入参和返回值 ,组合式api和函数编程不是一个东西哦!
//但是他们都是函数编程(不考虑使用this和arguments)
function sum2(...args:number[]) { 
   return args.reduce((prev, current) => prev + current, 0);
}

//参数的类型直接参数后面:标识 ,函数的返回值在 { }前面来标识
//            表达式的类型 ↓               参数的类型↓ 
//const sum3: (...args:any[]) => any = (...args:any[]):any => { 
//函数主要是考虑兼容性,什么样的函数赋给什么样的函数 这可能是我们所关心的
const sum3: (...args:any[]) => any = (...args:any[]):any => {
    return args.reduce((prev, current) => prev + current, 0);
}

类型重载

  • ts 中函数有一个概念:重载(类型的重载),对于强类语言可以一个函数写多遍(参数不同),js实现重载靠的是arguments
  • 入参是一个字符串 或者是数字 => [‘字符串’] [‘数字’]
  • string[]|number[]代表是数组里存的都是字符串和数组里存的都是number (number|string)[]代表数组里面可以放number和string
  • 根据不同的入参(value:string|number)来有不同的返回时(string[]|number[]),我们需要考虑来通过类型的重载来实现
function toArray2(value:string):string[];//函数的重载
function toArray2(value:number):number[];//函数的重载
//上面的声明,仅仅是类型上的重载
function toArray2(value:string|number):string[]|number[] { //函数的实现
    return []
}    
let arr = toArray2('1')//string[]
let arr2 = toArray2(1)//number[]

下面是代码加注释哦

//函数中的类型 1:函数的声明方式  2:函数的参数 3:函数的返回值

//function关键字来声明的函数可以提升到当前作用域顶部

//对于ts来说 function关键和const add1=function有区别, function关键字声明的函数 不能标注函数类型

//通过表达式来申明的函数:必须赋予的值要满足定义的类型(要求有一个兼容性在里面)
function add(x, y) {
    return x + y;
}

//1)函数的定义(x: any, y: any) => any |  { (x: any, y: any): any }

// type Add = (x: any, y: any) => any;
// type Add ={ (x: any, y: any): any };
// const sum: Add = function (x:string,y:string) {
//     return x + y;
// }
//如果表明函数类型,再使用的时候以表明的函数为准

//2) 参数  可选参数 ?是可选参数和 string | undefined 必须得传参,可选参数只能在列表参数的后面
//=是默认值  y:string='1'  y?:string

//例如:y?:string  y:string | undefined
//const sum = function和const sum: Add = function (x:string,y:string)的区别是一样的,sum = function可推导出类型,
//type Add ={ (x: string, y: string): string };
const sum = function (x:string,y:string='1') {
    return x + y;
}
//这里如果是兼容处理,采用的是默认值的方式,不是你赋值的类型  type Add ={ (x: string, y?: string): string };
sum('1')


//3、参数this问题
// 尽量不采用this 来作为函数的上下文,this的缺陷就是类型推导问题

//如果想限制this的类型,那么需要手动指定this类型
function getValue(this:IPerson,key:Ikeys) {    //this不是形参,是标明参数的类型
    // return this[key];
    return 1
}
//我想根据值来 获取类型 typeof  配合type来声明新的类型
const person = {name: 'jack', age: 18,address:'邯郸大名'}

type IPerson = typeof person;//提取对象的类型为IPerson type类型会提升到顶部

type Ikeys = keyof IPerson;//提取对象的key为Ikey
//可以将子类型赋予给父类型  子类型:IPerson  父类型:{name:string,age:number}
getValue.call(person, 'name');

//函数中有arguments 但是我们不建议使用
function sum2(...args:number[]) { // 函数编程:入参和返回值 ,组合式api和函数编程不是一个东西哦!但是他们都是函数编程(不考虑使用this和arguments)
   return args.reduce((prev, current) => prev + current, 0);

}

//参数的类型直接参数后面:标识 ,函数的返回值在 { }前面来标识
//            表达式的类型 ↓               参数的类型↓ 
//const sum3: (...args:any[]) => any = (...args:any[]):any => { 函数主要是考虑兼容性,什么样的函数赋给什么样的函数 这可能是我们所关心的

const sum3: (...args:any[]) => any = (...args:any[]):any => {
    return args.reduce((prev, current) => prev + current, 0);
}

//ts 中函数有一个概念:重载(类型的重载),对于强类语言可以一个函数写多遍(参数不同),js实现重载靠的是arguments

//入参是一个字符串 或者是数字 => ['字符串']  ['数字']
//string[]|number[]代表是数组里存的都是字符串和数组里存的都是number  (number|string)[]代表数组里面可以放number和string

//根据不同的入参(value:string|number)来有不同的返回时(string[]|number[]),我们需要考虑来通过类型的重载来实现

function toArray2(value:string):string[];//函数的重载
function toArray2(value:number):number[];//函数的重载
//上面的声明,仅仅是类型上的重载
function toArray2(value:string|number):string[]|number[] { //函数的实现
    return []
}    
let arr = toArray2('1')//string[]
let arr2 = toArray2(1)//number[]



export { }//解决ts文件报错问题  模块化的问题

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

裴嘉靖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值