什么是类型注解和类型推断?

在TypeScript的世界里,给数据标注类型主要有两种方式:一种是类型注解,就是你亲手写下类型;另一种是类型推断,也就是编译器根据上下文自动猜出类型。理解这俩的区别,能让你写出更简洁又安全的代码。

类型注解:你明确告诉编译器

类型注解就是由开发者显式地为变量、函数参数或返回值指定类型。你用一个冒号:后面跟上类型来标注。

let username: string = '小明';
const age: number = 25;
function greet(name: string): string {
  return `你好,${name}`;
}

这里,我们明确告诉TypeScript:username是字符串,age是数字,greet函数接收一个字符串参数并返回一个字符串。好处是意图清晰,尤其在函数签名里,类型注解就像一份文档。

但很多时候,你不需要写这么啰嗦。TypeScript很聪明,它能自己猜出来。

类型推断:编译器替你干活

类型推断是TypeScript的核心便利特性。当你声明一个变量并立即赋值时,TypeScript会根据这个初始值自动推断出它的类型。

let username = '小明'; // TypeScript 推断出 username 的类型是 string
const age = 25;        // 推断出 age 的类型是 25(字面量类型)

注意第二行,因为用了constage被推断为字面量类型25,而不是宽泛的number。这是更精确的类型推断。

对于函数返回值,如果你不写返回类型注解,TypeScript会根据函数体内的return语句自动推断。

function add(a: number, b: number) {
  return a + b; // TypeScript 推断出返回值类型是 number
}

这让你在大多数时候可以省去写返回类型的麻烦,除非你想让返回类型比推断的更宽泛或更具体。

什么时候必须用注解?什么时候可以依赖推断?

你应该尽量依赖类型推断。它能减少代码噪音,让逻辑更突出。在变量初始化、简单的函数返回值这些场景,不写注解通常是更好的选择。

但在下面这些情况,主动写类型注解就很有必要了:

  1. 当你要声明一个变量但暂时不初始化时。
    typescript let data: SomeComplexType; // 没有初始值,编译器猜不出来,必须注解
  2. 当你想让函数的返回类型比推断的更宽泛或更精确时。比如你希望函数返回number | null,但函数体可能只返回number
  3. 当一个对象字面量的结构比较复杂,你希望明确它的形状时(虽然这时用接口或类型别名来注解更常见)。
  4. 当函数的参数类型无法从上下文推断时(这是最常见的使用场景)。

说到底,类型注解和推断是互补的。注解提供明确契约和文档,推断提供简洁和开发效率。好的TypeScript代码是在两者之间找到平衡:让编译器多做推断,在你需要明确契约或帮助编译器的地方,才加上清晰的注解。

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容