开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情
函数类型兼容性
- 参数个数 fun2赋值给fun1不会报错,因为fun1有能力接受多个参数,你给他几个他处理几个就行了 fun1赋值给fun2不行啊,fun2只能处理1个参数,给多了也只处理1个,这个值需要多个参数,但是类型只能收一个参数。
特点:可少不可多
let fun1 = (name: string, age: string) => { }
let fun2 = (x: string) => { };
// fun1 = fun2;
fun2 = fun1;
- 参数类型 fun2 赋值 给fun1不会报错,fun3赋值给fun1会报错,因为参数类型不兼容。如果fun1的类型改成联合类型number|string,就不会报错了。
let fun1 = (x: number) => { }
let fun2 = (x: number) => { }
let fun3 = (x: string) => { }
fun1 = fun2;
fun1 = fun3;
- 参数返回值 返回值类型必须相同,fun2赋值给fun1可以,fun3赋值给fun1不可以
let fun1 = (): number => 18
let fun2 = (): number => 19
let fun3 = (): string => "20"
fun1 = fun2;
fun1 = fun3;
- 双向协变
- 参数的双向协变 严格模式下,不可以把少的赋值给多的,可以把多的赋值给少的, 大概意思是,被赋值的类型可以接收的参数,决定是否可以取当前的值,如果当前值的参数类型为string|number,这个被赋值的类型的参数类型为number,那就是兼容的,因为用户只能传number值,而函数实际上可以处理number和string,但是不重要,只是忽略处理string的能力就行了
let fun1 = (x: number | string) => { }
let fun2 = (x: number) => { }
fun2 = fun1
fun1 = fun2;
- 返回值的双向协变
不能将返回值是联合类型的赋值给具体的类型,可以将具体的类型赋值给联合类型。类型缩小化原则,
let fun1 = (x: boolean): number | string => { return x ? 10 : 'shi则帮' }
let fun2 = (x: boolean): number => { return 10 }
fun1 = fun2;
fun2 = fun1
- 函数重载 不能将重载少的赋值给重载多的,可以将重载多的赋值给重载少的
function add(x: number, y: number): number;
function add(x: string, y: string): string;
function add(x: any, y: any) {
return x + y
}
function sub(x: number, y: number): number;
function sub(x: any, y: any) {
return x - y;
}
let fn = add;
fn = sub;
- 可选参数及剩余参数 下面都是可以的。
function func(args: any[], callBack: (...args: any[]) => void): void {
}
func([1, 2], (x, y) => console.log(x + y))
func([1, 2], (x?, y?) => console.log(x + y))
func([1, 2], (x, y?, z?) => console.log(x + y + z))