TypeScript 类型推断

摘要:在本教程中,您将了解 TypeScript 中的类型推断。

类型推断描述了 TypeScript 在您没有显式添加类型注解时,如何以及在哪里推断类型。

基本类型推断

声明变量时,您可以使用类型注解显式指定其类型。例如

let counter: number;Code language: JavaScript (javascript)

但是,如果您使用数字初始化 counter 变量,TypeScript 会将 counter 的类型推断为 number。例如

let counter = 0;Code language: JavaScript (javascript)

它等价于以下语句

let counter: number = 0;Code language: JavaScript (javascript)

同样,当您为函数参数赋值时,TypeScript 会将参数的类型推断为默认值的类型。例如

function setCounter(max=100) {
    // ...
}Code language: JavaScript (javascript)

在此示例中,TypeScript 将 max 参数的类型推断为 number

类似地,TypeScript 将 increment() 函数的以下返回值类型推断为 number

function increment(counter: number) {
    return counter++;
}Code language: JavaScript (javascript)

它与以下代码相同

function increment(counter: number) : number {
    return counter++;
}Code language: JavaScript (javascript)

最佳通用类型算法

考虑以下赋值

let items = [1, 2, 3, null];Code language: JavaScript (javascript)

为了推断 items 变量的类型,TypeScript 需要考虑数组中每个元素的类型。

它使用最佳通用类型算法分析每个候选类型,并选择与所有其他候选类型兼容的类型。

在这种情况下,TypeScript 选择数字或 null 的数组类型number | null) [])作为最佳通用类型。请注意,| 在类型中表示 OR 运算符。

如果您向 items 数组添加一个字符串,TypeScript 将推断 items 的类型为数字和字符串数组:(number | string)[]

let items = [1, 2, 3, 'Cheese'];Code language: JavaScript (javascript)

上下文类型

TypeScript 使用变量的位置来推断其类型。此机制称为上下文类型。例如

document.addEventListener('click', function (event) {
    console.log(event.button); 
});Code language: JavaScript (javascript)

在此示例中,由于 click 事件,TypeScript 知道 event 参数是 MouseEvent 的实例。

但是,当您将 click 事件更改为 scroll 事件时,TypeScript 将发出错误

document.addEventListener('scroll', function (event) {
    console.log(event.button); // compile error
});Code language: JavaScript (javascript)

错误

Property 'button' does not exist on type 'Event'.(2339)Code language: JavaScript (javascript)

TypeScript 知道在这种情况下,eventUIEvent 的实例,而不是 MouseEvent。而 UIEvent 没有 button 属性,因此 TypeScript 会抛出错误。

您将在许多情况下发现上下文类型,例如函数调用的参数、类型断言、对象的成员和数组字面量、返回语句以及赋值的右侧。

类型推断与类型注解

以下是类型推断和类型注解的区别

类型推断类型注解
TypeScript 猜测类型您显式地告诉 TypeScript 类型

那么,什么时候使用类型推断和类型注解呢?

在实践中,您应该尽可能地多使用类型推断。在以下情况下,您使用类型注解

  • 当您声明一个变量并在稍后为其赋值时。
  • 当您需要一个无法推断的变量时。
  • 当函数返回 any 类型时,您需要澄清其值。

总结

  • 类型推断发生在您初始化变量、设置参数默认值以及确定函数返回值类型时。
  • TypeScript 使用最佳通用类型算法来选择与所有变量兼容的最佳候选类型。
  • TypeScript 还使用上下文类型根据变量的位置推断变量的类型。
本教程对您有帮助吗?