「这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战」。
类型推论
TypeScript里,在有些没有明确指出类型的地方,类型推论会帮助提供类型。
这种推断发生在初始化变量和成员,设置默认参数值和决定函数返回值时。
定义时不赋值
let a
a = 18
a = 'lin'
定义时不赋值,就会被 TS 自动推导成 any 类型,之后随便怎么赋值都不会报错。
初始化变量
例如:
let userName = 'lin'
因为赋值的时候赋的是一个字符串类型,所以 TS 自动推导出 userName 是 string 类型。
这个时候,再更改 userName 时,就必须是 string 类型,是其他类型就报错,比如:
设置默认参数值
函数设置默认参数时,也会有自动推导
比如,定义一个打印年龄的函数,默认值是 18
function printAge(num = 18) {
console.log(num)
return num
}
那么 TS 会自动推导出 printAge 的入参类型,传错了类型会报错。
决定函数返回值
决定函数返回值时, TS 也会自动推导出返回值类型。
比如一个函数不写返回值,
function welcome() {
console.log('hello')
}
TS 自动推导出返回值是 void 类型
再比如上文的 printAge 函数,TS 会自动推导出返回值是 number 类型。
如果我们给 printAge 函数的返回值定义为 string 类型,看看会发生什么。
function printAge(num = 18) {
console.log(num)
return num
}
interface PrintAge {
(num: number): string
}
const printAge1: PrintAge = printAge
很显然,定义的类型和 TS 自动推导出的类型冲突,报错:
最佳通用类型
当需要从几个表达式中推断类型时候,会使用这些表达式的类型来推断出一个最合适的通用类型。比如,
let arr = [0, 1, null, 'lin'];
又比如:
let pets = [new Dog(), new Cat()]
虽然 TS 可以推导出最合适的类型,但最好还是在写的时候就定义好类型,上文的例子,我们可以这么写:
type arrItem = number | string | null
let arr: arrItem[] = [0, 1, null, 'lin'];
let pets: Pets[] = [new Dog(), new Cat()]
小结
类型推论虽然能为我们提供帮助,但既然写了 TS,除非是函数默认返回类型为 void 这种大家都知道的,其他的最好每个地方都定义好类型。
往期