- 对函数的参数进行类型校验
- 对函数的返回值进行类型校验
- 对函数本身进行类型校验
函数声明
通过 function 关键字来进行声明
function sum(x:string, y:string):string{return x + y;}console.log(sum('1', '2')); //"12"
通过表达式
写法1:自动根据当前等号右边的内容,推断左边的类型
const sum = (x:string, y:string):string => x + y;
写法2:声明一个类型Sum,把该类型赋予函数sum,函数sum就必须要按照Sum的要求来。
// 定义一个 Sum 类型,其有2个必传参数,都是字符串类型,并且函数返回值类型为字符串类型。type Sum = (x:string, y:string) => string;const sum: Sum = (x, y) => x + y;
void 没有函数返回值
// 定义一个 Sum 类型,其有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!;
```typescriptfunction print(name:string, age?:number):void{console.log(name, age);}print('jack'); //jack undefinedprint('jack', 18); //jack 18
默认参数
function ajax(url:string, method:string="GET"){console.log(url, method);}ajax('/user'); // /user GETajax('/user', 'POST'); // /user POST
剩余参数
function sum(...args:number[]){return args.reduce((val, item) => val+item, 0);}console.log(sum(1,2,3)); //6console.log(sum(1,2,3,4,5)); //15
函数重载
- 在Java中的重载,指的是两个或者两个以上的同名函数,参数不一样。
- 在typescript中,表现为给同一个函数提供多个函数类型定义。
- 函数重载,有一个非常好的案例,redux的compose实现。
示例1:实现一个函数,只能传参字符串或数字,返回其分割后得到的数组。如:
123 => [‘1’, ‘2’, ‘3’] ‘abc’ => [‘a’, ‘b’, ‘c’]
// 重载方法必须要写在真实方法的上面function toArray(value:string):string[]function toArray(value:number):number[]function toArray(value:number|string){if (typeof value === 'string'){return value.split('');} else {return value.toString().split('').map(item => Number(item));}}console.log(toArray(123)); //[1, 2, 3]console.log(toArray('abc')); //["a", "b", "c"]
示例2:有一个函数,有2个参数,我们想实现,要不都传字符串,要不都传数字的约束
// 方法1:无法实现function add1(x:string|number, y:string|number):void{}add1('a', 'b');add1(1, 2);add1('a', 2); //不报错// 方法2:重载function add2(x:string, y:string):voidfunction add2(x:number, y:number):voidfunction add2(x:any, y:any):void{}add2('a', 'b');add2(1, 2);// add2('a', 2); //报错
示例3:
interface Callback {(data:any):void;}export function aa(name:string, age:number, callback:Callback):void;export function aa(name:string, callback:Callback):void;export function aa(...args:any[]){console.log(args.length);args[args.length -1](args);}aa('jack', 18, (data) =>{console.log(data);})// 3// [ 'jack', 18, [Function (anonymous)] ]
ts中函数第一个参数可以传一个 this
let obj = {hasThis(this:any, name:string){console.log('hasThis=>', this, name);},noThis(name:string){console.log('noThis=>', name);}}obj.hasThis('cy'); //hasThis=> {hasThis: ƒ, noThis: ƒ} cyobj.noThis('cy'); //noThis=> cy
