• 对函数的参数进行类型校验
  • 对函数的返回值进行类型校验
  • 对函数本身进行类型校验

函数声明

通过 function 关键字来进行声明

  1. function sum(x:string, y:string):string{
  2. return x + y;
  3. }
  4. console.log(sum('1', '2')); //"12"

通过表达式

写法1:自动根据当前等号右边的内容,推断左边的类型
  1. const sum = (x:string, y:string):string => x + y;

写法2:声明一个类型Sum,把该类型赋予函数sum,函数sum就必须要按照Sum的要求来。
  1. // 定义一个 Sum 类型,其有2个必传参数,都是字符串类型,并且函数返回值类型为字符串类型。
  2. type Sum = (x:string, y:string) => string;
  3. const sum: Sum = (x, y) => x + y;

void 没有函数返回值
  1. // 定义一个 Sum 类型,其有2个必传参数,都是数字类型,并且函数无返回值。
  2. type Sum = (x:number, y:number) => void;

可选参数

  • 在TS中函数的形参和实参必须一样,不一样就要配置可选参数,而且必须是最后一个参数。
  • 可选参数和默认值不能一起使用 ```typescript // 这种写法表示 y是个必要参数,其值类型可能是 number 或 undefined const sum1 = (x:number, y:number|undefined):number => x + y!;

// 这种写法表示 y是个可选参数,其值类型可能是number 或 undefined const sum = (x:number, y?:number):number => x + y!;

  1. ```typescript
  2. function print(name:string, age?:number):void{
  3. console.log(name, age);
  4. }
  5. print('jack'); //jack undefined
  6. print('jack', 18); //jack 18

默认参数

  1. function ajax(url:string, method:string="GET"){
  2. console.log(url, method);
  3. }
  4. ajax('/user'); // /user GET
  5. ajax('/user', 'POST'); // /user POST

剩余参数

  1. function sum(...args:number[]){
  2. return args.reduce((val, item) => val+item, 0);
  3. }
  4. console.log(sum(1,2,3)); //6
  5. console.log(sum(1,2,3,4,5)); //15

函数重载

  • 在Java中的重载,指的是两个或者两个以上的同名函数,参数不一样。
  • 在typescript中,表现为给同一个函数提供多个函数类型定义。
  • 函数重载,有一个非常好的案例,redux的compose实现。

示例1:实现一个函数,只能传参字符串或数字,返回其分割后得到的数组。如:

123 => [‘1’, ‘2’, ‘3’] ‘abc’ => [‘a’, ‘b’, ‘c’]

  1. // 重载方法必须要写在真实方法的上面
  2. function toArray(value:string):string[]
  3. function toArray(value:number):number[]
  4. function toArray(value:number|string){
  5. if (typeof value === 'string'){
  6. return value.split('');
  7. } else {
  8. return value.toString().split('').map(item => Number(item));
  9. }
  10. }
  11. console.log(toArray(123)); //[1, 2, 3]
  12. console.log(toArray('abc')); //["a", "b", "c"]

示例2:有一个函数,有2个参数,我们想实现,要不都传字符串,要不都传数字的约束
  1. // 方法1:无法实现
  2. function add1(x:string|number, y:string|number):void{}
  3. add1('a', 'b');
  4. add1(1, 2);
  5. add1('a', 2); //不报错
  6. // 方法2:重载
  7. function add2(x:string, y:string):void
  8. function add2(x:number, y:number):void
  9. function add2(x:any, y:any):void{}
  10. add2('a', 'b');
  11. add2(1, 2);
  12. // add2('a', 2); //报错

示例3:
  1. interface Callback {
  2. (data:any):void;
  3. }
  4. export function aa(name:string, age:number, callback:Callback):void;
  5. export function aa(name:string, callback:Callback):void;
  6. export function aa(...args:any[]){
  7. console.log(args.length);
  8. args[args.length -1](args);
  9. }
  10. aa('jack', 18, (data) =>{
  11. console.log(data);
  12. })
  13. // 3
  14. // [ 'jack', 18, [Function (anonymous)] ]

ts中函数第一个参数可以传一个 this

  1. let obj = {
  2. hasThis(this:any, name:string){
  3. console.log('hasThis=>', this, name);
  4. },
  5. noThis(name:string){
  6. console.log('noThis=>', name);
  7. }
  8. }
  9. obj.hasThis('cy'); //hasThis=> {hasThis: ƒ, noThis: ƒ} cy
  10. obj.noThis('cy'); //noThis=> cy