TS 类型推论

941 阅读2分钟

「这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战」。

类型推论

TypeScript里,在有些没有明确指出类型的地方,类型推论会帮助提供类型

这种推断发生在初始化变量和成员,设置默认参数值和决定函数返回值时。

定义时不赋值

let a

a = 18
a = 'lin'

定义时不赋值,就会被 TS 自动推导成 any 类型,之后随便怎么赋值都不会报错。

image.png

初始化变量

例如:

let userName = 'lin'

image.png

因为赋值的时候赋的是一个字符串类型,所以 TS 自动推导出 userName 是 string 类型。

这个时候,再更改 userName 时,就必须是 string 类型,是其他类型就报错,比如:

image.png

设置默认参数值

函数设置默认参数时,也会有自动推导

比如,定义一个打印年龄的函数,默认值是 18

function printAge(num = 18) {
    console.log(num)
    return num
}

那么 TS 会自动推导出 printAge 的入参类型,传错了类型会报错。

image.png

决定函数返回值

决定函数返回值时, TS 也会自动推导出返回值类型。

比如一个函数不写返回值,

function welcome() {
    console.log('hello')
}

TS 自动推导出返回值是 void 类型 image.png

再比如上文的 printAge 函数,TS 会自动推导出返回值是 number 类型。

如果我们给 printAge 函数的返回值定义为 string 类型,看看会发生什么。

function printAge(num = 18) {
    console.log(num)
    return num
}

interface PrintAge {
    (num: number): string
}

const printAge1: PrintAge = printAge

很显然,定义的类型和 TS 自动推导出的类型冲突,报错:

image.png

最佳通用类型

当需要从几个表达式中推断类型时候,会使用这些表达式的类型来推断出一个最合适的通用类型。比如,

let arr = [0, 1, null, 'lin'];

image.png

又比如:

let pets = [new Dog(), new Cat()]

image.png

虽然 TS 可以推导出最合适的类型,但最好还是在写的时候就定义好类型,上文的例子,我们可以这么写:

type arrItem = number | string | null
let arr: arrItem[] = [0, 1, null, 'lin'];

let pets: Pets[] = [new Dog(), new Cat()]

小结

类型推论虽然能为我们提供帮助,但既然写了 TS,除非是函数默认返回类型为 void 这种大家都知道的,其他的最好每个地方都定义好类型。

往期

轻松拿下 TS 泛型

TS 中 interface 和 type 究竟有什么区别?

通俗易懂的 TS 基础知识总结