TS-类型推断
TypeScript 编译器会根据一些简单的规则来推断你定义的变量的类型
当你没有标明变量的类型时,编译器会将变量的初始值作为该变量的类型
例如:
let num = 3
//此时我未标注 num 变量的类型 ,初始值为数字类型 , 变量num为数字类型
let str = 'string'
//此时我未标注 str 变量的类型 ,初始值为字符串类型 , 变量str为字符串类型
当然,类型推断不仅仅发生在简单数据类型上面,复杂数据类型上依然可以被TypeScript编译器进行推断
例如:
let arr = ['one','two','three']
//此时未标注 arr 数组中的每个元素类型 , 初始值为字符串,则相当于:
//let arr : string[]
//但如果数组中没有元素,为空数组,则类型为 never
let obj = {a:1,b:2}
//此时未标注对象内的数据类型,默认为初始值,为数字类型
//let obj : {a:number,b:number}
//不仅如此,ts编译器还会推断函数的返回值类型
const fun = (a:number,b:number) =>{
retrun a + b;
}
//const fun =(a:number,b:numer) => number
但在使用函数返回值类型推断时,在编写函数内部的代码就失去了函数返回值类型检测功能,使用函数返回值的类型需要明确的指定
正常情况下,TypeScirpt编译器时可以推断出变量类型的,开发者不需要编写类型注释,但在TypeScirpt编译器不能正常推断类型时,开发者需要编写类型注释
-
第一种情况:
如果一个变量被声明后,没用被立即初始化,那么编译器将不能正确推断出它的类型,将被赋予any类型
let anything //此时变量未被及时初始化,编译器默认它为any类型:let anything :any
-
第二种情况:
当被调用的函数的返回值为any类型的时候,应该使用类型注释来声明它的类型
let json ='{"name":"张三"}'; let person = JSON.parse(json); //let json:string //let person:any => let person:{name:string}
-
第三种情况:
当变量有可能有多个类型时:
let num = [-10,-1,20] //target => bollean|number let target =false for(let i=0;i<num.length;i++){ if(num[i]>0){ //不能将number类型分配给bollean类型 target = num[i]; } }
-
第四种情况:
函数的参数必须标注类型,TypeScript并不能推断函数参数的类型