当前位置:   article > 正文

TypeScript——函数(函数定义类型、可选参数和默认参数、剩余参数、函数类型变量、使用接口封装函数变量类型)_typescript parameters

typescript parameters

目录

 一、函数

1、为函数定义类型

2、可选参数和默认参数

3、剩余参数

4、函数类型变量

5、使用接口封装函数变量类型


 一、函数

参数列表里面的每个参数都需要名称和类型。

1、为函数定义类型

我们可以给每个参数添加类型之后再为函数本身添加返回值类型。

TypeScript能够根据返回语句自动推断出返回值类型,因此我可以省略它。

函数形参必须声明数据类型,返回值可以不声明数据类型(根据函数体种的逻辑推到出的)

  1. //声明式,作用域中直接声明function
  2. function add(x: number, y: number): number {
  3. return x + y;
  4. }
  5. function fm(n1:number,n2:string):[number,string]{
  6. return [n1*2,n2]
  7. }
  8. function fm3(n1:number,n2:string):any[]{
  9. return [n1*2,n2,100]
  10. }
  11. //定义式(当作数据引用)
  12. let myAdd = function(x: number, y: number): number { return x + y; };
  13. let obj={fn:function():void{}};
  14. let arr=[function():void{}];
  15. (function(n:number):number{return n*2})(100)

2、可选参数和默认参数

传递给一个函数的参数个数必须与函数期望的参数个数一致。

  1. function buildName(firstName: string, lastName: string) {
  2. return firstName + " " + lastName;
  3. }
  4. let result1 = buildName("Bob"); // error, too few parameters
  5. let result2 = buildName("Bob", "Adams", "Sr."); // error, too many parameters
  6. let result3 = buildName("Bob", "Adams"); // ah, just right

在TypeScript里我们可以在参数名旁使用 `?`实现可选参数的功能。

可选参数必须跟在必选参数后面

当然,还可以给参数设置默认值,在所有必选参数后面带默认值的参数都是可选的,与可选参数一样,在调用函数的时候可以省略。

ps:带默认值的参数不需要放在必选参数的后面。 如果带默认值的参数出现在必须参数前面,用户必须明确的传入 `undefined`值从而来获得默认值。

  1. function buildName(firstName: string, lastName?: string) {
  2. if (lastName)
  3. return firstName + " " + lastName;
  4. else
  5. return firstName;
  6. }
  7. let result1 = buildName("Bob"); // works correctly now
  8. let result2 = buildName("Bob", "Adams", "Sr."); // error, too many parameters
  9. let result3 = buildName("Bob", "Adams"); // ah, just right
  10. function fn(a1:number,n1?:number,n2?:string):Array<number|string>{
  11. return [a1,n2]
  12. }
  13. fn(100) //因为第二个参数没传,所以是unde,在非严格模式下可以将undef传给任何类型
  14. fn(100,100,"hello")
  15. function fm (n2:string,n3?:number,n1:number=100) { //n1是可选默认
  16. }
  17. fm("hello")

3、剩余参数

在js里面叫rest参数   ...restArr。必须写在最后面

  1. function buildName(firstName: string, ...restOfName: string[]) {
  2. return firstName + " " + restOfName.join(" ");
  3. }
  4. let employeeName = buildName("Joseph", "Samuel", "Lucas", "MacKinzie");
  5. function fm (n1:number,n2:string,...reset) {
  6. console.log(reset)
  7. }
  8. fm(10,"hello",10,203,405,[10]) // [10,203,405,[10]]
  9. fm(10,"hello") //[]
  10. function fg (n1:number,n2:string,...reset:[number,string]) { //如果这样写元组,那参数必须传
  11. console.log(reset) //[100,"hello"]
  12. }
  13. fg(10,"hello",100,"hello")
  14. function fg2 (n1:number,n2:string,...reset:number[]) {
  15. console.log(reset)
  16. }
  17. fg2(10,"hello",100,"hello") //报错
  18. fg2(100,"helloo")
  19. fg2(100,"helloo",10,203,4)
  20. fg2(100,"helloo",[10,203,4]) //报错
  21. function fg (n1:number,n2:string,...reset:[number,string]):[any[],Array<number>] {
  22. return [[10,203,true],[10,20]]
  23. }
  24. fg(100,"hello",10,"hello")

4、函数类型变量

  1. 变量的类型可以声明为函数类型;

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

2.函数类型属于自定义类型,包含两部分:参数类型和返回值类型;

  1. //声明一个变量并指定类型为自定义的函数类型
  2. let myadd:(x:number, y:number)=>number;
  3. //声明一个函数
  4. function add(x: number, y: number): number {
  5. return x + y;
  6. }
  7. //把函数赋值给类型为函数类型的变量
  8. myadd = add;
  9. //赋值匿名函数
  10. myadd = function(x: number, y: number): number {
  11. return x + y;
  12. }
  13. //赋值箭头函数
  14. myadd = (x: number, y: number):number=>{
  15. return x + y;
  16. }

3.只要参数类型是匹配的,那么就认为它是有效的函数类型,并不要求参数名一样,很多时候参数名是为了增加可读性

  1. let myAdd: (baseValue: number, increment: number) => number =
  2. function(x: number, y: number): number { return x + y; };

4.在函数和返回值类型之前使用( `=>`)符号,返回值类型是函数类型的必要部分,如果函数没有返回任何值,你也必须指定返回值类型为 `void`而不能留空。

  1. //这里是声明c变量是一个函数类型 函数类型的写法 必须是: (某某参数类)=>返回值 这个格式不是箭头函数只是表达函数类型的表达式
  2. let c:(n1:number,n2:[number])=>[number,string];
  3. //然后将c赋值给声明式的函数
  4. c=function(agr1:number,arg2:[number]):[number,string]{
  5. return [100,"hello"]
  6. }
  7. //也可以把c赋值给箭头函数
  8. c=(a1:number,a2:[number]):[number,string]=>{
  9. return[10,"a"]
  10. }

5、使用接口封装函数变量类型

接口可以描述函数类型;为了使用接口表示函数类型,我们需要给接口定义一个调用签名。它就像是一个只有参数列表和返回值类型的函数定义。

自定函数类型代码往往很长,可以使用接口来封装该类型,之后使用接口来代表该类型

  1. //函数类型接口
  2. interface addType {
  3. (baseVaule:number, increValue:number):number
  4. }
  5. function add(x: number, y: number): number {
  6. return x + y;
  7. }
  8. let myadd1:addType = add;
  9. let myadd2:addType = (x:number, y:number):number=>{
  10. return x+y;
  11. }
  12. interface UseEffect{
  13. ():[] //没有参数,返回值是没有值的元组
  14. }

 eg:

  1. interface callback1{
  2. (number):number
  3. }
  4. interface UseEffect{
  5. (number,callback1):[number]
  6. }
  7. interface obj1{ //对象
  8. age:number,
  9. name:string
  10. }
  11. interface UseMemo{
  12. (obj1):[obj1,UseEffect]
  13. }
  14. let reactuseEfeect:UseMemo;
  15. reactuseEfeect=function(arg1:obj1):[obj1,UseEffect] {
  16. function fg(n1:number,n2:callback1):[number]{
  17. return [100]
  18. }
  19. return [{age:20,name:"karen"},fg]
  20. }
  21. let [x,y]=reactuseEfeect({age:20,name:"karen"})
  22. // y的使用
  23. y(100,function(arg:number):number{
  24. return 1
  25. })
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/425557
推荐阅读
相关标签
  

闽ICP备14008679号