函数的标注
一个函数可以标注参数、返回值
1 2 3 4 5 6 7 8 9 10 11
| function fn(a: string): string {};
let fn: (a: string) => string = function(a) {};
type callback = (a: string): string; interface ICallBack { (a: string): string; }
let fn: callback = function(a) {}; let fn: ICallBack = function(a) {};
|
可选参数和默认参数
可选参数
通过参数名后面添加 ?
来标注该参数是可选的
1 2 3 4 5 6 7 8
| let div = document.querySelector('div'); function css(el: HTMLElement, attr: string, val?: any) {
}
div && css( div, 'width', '100px' );
div && css( div, 'width' );
|
默认参数
我们还可以给参数设置默认值
- 有默认值的参数也是可选的
- 设置了默认值的参数可以根据值自动推导类型
1 2 3 4 5 6 7 8 9 10 11
| function sort(items: Array<number>, order = 'desc') {} sort([1,2,3]);
function sort(items: Array<number>, order:'desc'|'asc' = 'desc') {}
sort([1,2,3]);
sort([1,2,3], 'asc');
sort([1,2,3], 'abc');
|
剩余参数
剩余参数是一个数组,所以标注的时候一定要注意
1 2 3 4 5 6 7 8 9 10
| interface IObj { [key:string]: any; } function merge(target: IObj, ...others: Array<IObj>) { return others.reduce( (prev, currnet) => { prev = Object.assign(prev, currnet); return prev; }, target ); } let newObj = merge({x: 1}, {y: 2}, {z: 3});
|
函数中的this
对于普通函数而言,this
是会随着调用环境的变化而变化的,所以默认情况下,普通函数中的 this
被标注为 any
,但我们可以在函数的第一个参数位(它不占据实际参数位置)上显式的标注 this
的类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| interface T { a: number; fn: (x: number) => void; }
let obj1:T = { a: 1, fn(x: number) { console.log(this); } }
let obj2:T = { a: 1, fn(this: T, x: number) { console.log(this); } } obj2.fn(1);
|
箭头函数
箭头函数的 this
不能像普通函数那样进行标注,它的 this
标注类型取决于它所在的作用域 this
的标注类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| interface T { a: number; fn: (x: number) => void; }
let obj2: T = { a: 2, fn(this: T) { return () => { console.log(this); } } }
|
函数重载
有的时候,同一个函数会接收不同类型的参数返回不同类型的返回值,我们可以使用函数重载来实现,通过下面的例子来体会一下函数重载
1 2 3 4 5 6 7 8 9 10 11 12
| function showOrHide(ele: HTMLElement, attr: string, value: 'block'|'none'|number) { }
let div = document.querySelector('div');
if (div) { showOrHide( div, 'display', 'none' ); showOrHide( div, 'opacity', 1 ); showOrHide( div, 'display', 1 ); }
|
我们来看一下函数重载
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| function showOrHide(ele: HTMLElement, attr: 'display', value: 'block'|'none'); function showOrHide(ele: HTMLElement, attr: 'opacity', value: number); function showOrHide(ele: HTMLElement, attr: string, value: any) { ele.style[attr] = value; }
let div = document.querySelector('div');
if (div) { showOrHide( div, 'display', 'none' ); showOrHide( div, 'opacity', 1 ); showOrHide( div, 'display', 1 ); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| interface PlainObject { [key: string]: string|number; }
function css(ele: HTMLElement, attr: PlainObject); function css(ele: HTMLElement, attr: string, value: string|number); function css(ele: HTMLElement, attr: any, value?: any) { if (typeof attr === 'string' && value) { ele.style[attr] = value; } if (typeof attr === 'object') { for (let key in attr) { ele.style[attr] = attr[key]; } } }
let div = document.querySelector('div'); if (div) { css(div, 'width', '100px'); css(div, { width: '100px' });
css(div, 'width'); }
|