函数
基础定义
显式指定函数参数和返回值的类型
tsx
const add = (a: number, b: number): number => {
return a + b;
}
/*
function 函数名(参数:参数类型):返回值的类型{
return 返回值
}
函数特殊 , 如果一个函数没有return 这个函数返回值类型是 void
*/
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
或者用type来声明函数类型
tsx
// (参数:类型)=>返回值类型
type addFnType = (a: number, b:number) => number;
let addFn: addFnType = (num1, num2) => {
return num1 + num2;
}
1
2
3
4
5
2
3
4
5
或者用interface来声明函数类型
tsx
//接口指定 函数类型
interface IFn1{
//(参数:类型):返回值类型
(name:string):string
}
let fn1:IFn1 = (name:string)=>{
return "我叫"+name
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
函数参数类型
参数一般有:可选参数、默认参数、剩余参数;
可选参数
在类型标注的:
前添加?
表示 log 函数的参数 x 就是可缺省的;
tsx
function log(msg?: string):void {
console.log(msg);
}
1
2
3
2
3
可缺省是不是相当于msg参数的类型就是和string | undefined
等价呢?这个当然不是,string | undefined
的意思是这两个类型中的一种,而可缺省是不传的意思。
默认参数
tsx
function addFn1(num1: number = 1, num2: number = 2):number {
return num1 + num2;
}
1
2
3
2
3
函数的默认参数类型必须是参数类型的子类型
tsx
function log3(x: number | string = 'hello') {
console.log(x);
}
1
2
3
2
3
这里x参数的类型就是联合类型number | string
,函数默认参数的类型就是联合类型的子类型
剩余参数
tsx
function sum(...nums: number[]) {
return nums.reduce((a, b) => a + b, 0);
}
sum(1, 2); // => 3
sum(1, 2, 3); // => 6
1
2
3
4
5
2
3
4
5
this
函数中的this问题,一直都是javascript最令人头疼的问题,因为this的指向只有函数调用的时候才能确定。还有一些可以改变this指向的方法(apply,call,bind)。
但是在Typescript中,必须要明确的指定this的类型(严格模式下)。
tsx
type objType = {person: (n: string) => void, myname: string};
function person(this: Window | objType , name: string):void {
this.myname = name;
console.log(this.myname);
}
window.person = person;
window.person('window name');
let obj:objType = {
person,
myname: ''
};
obj.person('obj name');
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
单单是上面的代码是有问题的,我们还需要创建一个类型声明文件global.d.ts,为window对象上扩展两个属性person、myname;
tsx
interface Window {
person: (n: string) => void;
myname: string;
}
1
2
3
4
2
3
4
定义对象的函数属性时,只要实际调用中 this 的指向与指定的 this 指向不同,TypeScript 就能发现 this 指向的错误
tsx
interface ObjType2 {
name: string;
say: (this: ObjType2) => void;
}
let obj2:ObjType2 = {
name: 'obj2',
say() {
console.log(this.name);
}
}
obj2.say(); // ok
let t11 = obj2.say;
t11();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
注意: 1. 显式声明函数的返回值类型为 undfined,则会出现错误提示,如果没有返回值,我们用void表示; 2. 注意:显式注解函数中的 this 类型,它表面上占据了第一个形参的位置,但并不意味着函数真的多了一个参数,因为 TypeScript 转译为 JavaScript 后,“伪形参” this 会被抹掉,这算是 TypeScript 为数不多的特有语法。