function关键字声明
function fn(x: number, y: number): number {return x + y;}
函数表达式的声明
let fn: (x: Number, y: Number) => number = function (x: number, y: number): number {return x + y;};
完整的声明是这样的,类似于对象,我们要定义一个接口,然后给一个变量定义它的类型,然后进行赋值
注意中间的箭头,与es6中的箭头函数不同,在表示类型的情况下,箭头是用来表示返回值的类型的,当然在函数的中还是可以使用的
不过下面这种方式也可以通过编译,因为ts会进行类型推断,因此myFn的类型被推断为函数
let myFn = function (x: number, y: number): number {return x + y;};
接口定义函数
因为js中函数也是对象,因此可以用接口来定义函数
interface fn {(x: number, y: number): number;}//报错let myFn: fn = function (z: string, q: number):string {return z + q;};
另外,定义好的参数是不能多或者少的,这意味着与js不同,js中定义了两个参数,但是可以传入三个参数,而ts中定义了几个参数那么就只能传入几个参数
可选参数
但是可以在函数中使用 ? 来表示参数的可选,注意可选参数后不允许出现必选参数
interface fn {(x: number, y?: number): number;}let myFn: fn = function (l: number, m?: number): number {if (m) {return l + m;} else {return l;}}myFn(1);myFn(1, 2);
使用默认值代替可选参数
由于可选参数有之后不能出现必选参数的限制,因此可以使用默认值的方式代替可选参数,因为不传参就等于默认值,因此不使用 ? 也没关系
这样也没有可选参数后不能出现必选参数的限制,因为有默认值打底了
interface fn {(x: number, y?: number): number;//不能缺少问号}let myFn: fn = function (l: number, m: number = 1): number {if (m) {return l + m;} else {return l;}};myFn(1);myFn(1, 2);
只是,默认值只是在给函数编写内容的使用用,定义接口的时候还是需要 ? 的
剩余参数
ts中的剩余参数和js中的使用方法一样,只是也需要类型的定义
function fn(l: number, m: number, ...rest: number[]): number {return (l + m + rest.reduce((pre, cur) => {return pre + cur;}));}console.log(fn(1, 2, 3, 4, 5, 6, 7, 8, 9));//45
函数重载
重载就是根据传入的参数的类型、数量不同,而选择不同的方法
与其它语言中的重载不同,ts的重载是在函数实现的过程中显示的进行的
声明是可以重复的,但是实现是不可以重复的
function log(x: number): void;function log(x: string): void;function log(x: number | string): void {if (typeof x === "number") {console.log("这是数字");} else {console.log("这是字符串");}}log(1);log("1");
如上,前两次都是函数的定义,定义类型和返回值,第三次是函数的实现
在第三次函数的实现中,显示的对x的类型进行检测,而选择不同的方法,这就是ts中函数的重载
