TS入门008函数下

函数里规定this

1
2
3
4
5
6
7
8
9
10
11
12
13
// 规定函数的this

interface Human{
name:string;
age:number;
}

function fn(this:Human){
console.log(this);
}

fn.call({name:'hjx',age:18})
// fn() // 报错 
  • ts明确规定 this是参数,不传递就导致问题
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function fn(this:any){
    console.log(this);
    function fn2(this:any){
    console.log(this);
    }
    fn2() // 此时this已经变了,谁叫你不用 call
    }

    fn.call({name:'hjx'})

重载

一个函数有不同的调用方式

1
2
3
4
5
6
7
8
//这是js代码
//这是js代码
//这是js代码
function add(a,b){return a + b;}

add(1,2) // 3
add('hjx','hi') // 'hjxhi'
add(1,'2') // '12'

ts重载

1
2
3
4
5
6
7
8
9
function add(a:number,b:number);
function add(a:string,b:string);
function add(a,b){
return a + b;
}

add(1,2) //3
add('hello','world') // helloworld
// add(1,'2') //报错
  • 注意! js不支持不同参数数量的重载,只支持相同参数数量的重载
  • 注意! js不支持不同参数数量的重载,只支持相同参数数量的重载

范型和重载的区别

1
2
3
4
5
6
7
8
function add(a:number,b:number);
function add(a:string,b:string);
function add(a,b){
return a + b;
}

// 重载可以确定具体的参数的类型
// 范型 太广泛了, 而且你无法检查 参数 a ,b是否支持 a + b

类型推断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function add(n1:string,n2:string){
return n1 + n2
}

var s = add('hi','aa');
console.log(s.split('')) // 没有写返回值的类型,为什么不报错

var s2 = {}
s2.split('') //报错


function add2(n1:string,n2:string){
return 0
}
var s3 = add2('hi','aa');
s3.split('') // 报错

如果你这样,ts就会猜 你返回的是什么 string|number

1
2
3
4
5
6
7
8
9
10
11
function add3(n1:string,n2:string){
if(n1 > '1'){
return n1

}else{
return 0
}
}

var s4 = add3('hi','aa');
s4.split('') // 此时他返回的类型有两种可能 string|number

类型兼容

1
2
3
4
5
6
7
8
9
10
11
12
interface Human{
name:string,
age:number
}

let x:Human = {name:'aa',age:18} //正常

// 如果你手贱非要加一个 gender 呢? 报错
// let x2:Human = {name:'aa',age:18,gender:'man'} // 报错

let y = {name:'aa',age:18,gender:'man'}
let x3:Human = y; //这样却没问题

这样做的好处就是节约你的类型个数

soundness 可靠性(浅尝辄止)

sound就是 从语法或逻辑上推断你的代码有木有问题

  • 如果推断出有问题不让你过,就是 sound(非常死板)
  • 如果推断出有问题还让你过,就是 unsound (不那么死板)