TypeScript 类型推断

类型推断(Type Inference)指在未显式写类型时,TypeScript 根据赋值或上下文自动推导出变量、表达式或函数的类型。它让代码既简洁又保留了类型检查的保护。

基础推断

声明变量并赋值时,TS 会根据初始值推断出类型:

let age = 25;      // 推断为 number
let name = "张三"; // 推断为 string
let ok = true;     // 推断为 boolean
// age = "abc";    // 报错:number 类型不能赋字符串
console.log(age, name, ok); // 输出:25 张三 true

多类型数组的推断

当数组元素类型不一时,TS 会推断出联合类型数组:

let arr = [1, "a", true];
// arr 被推断为 (string | number | boolean)[]
arr.push(2);       // 合法
arr.push("b");     // 合法
// arr.push(null); // 报错:null 不在该联合类型中
console.log(arr);  // 输出:[ 1, 'a', true, 2, 'b' ]

函数返回类型推断

函数没有标注返回类型时,TS 会根据 return 语句推断返回值的类型:

function add(a: number, b: number) {
  return a + b;            // 推断返回 number
}
function greet(name: string) {
  return `你好,${name}`;  // 推断返回 string
}
console.log(add(1, 2));     // 输出:3
console.log(greet("李四")); // 输出:你好,李四

注意:函数的参数类型不会自动推断,通常需要显式标注。

上下文类型推断

把函数字面量赋给带类型的变量,或作为回调传入时,TS 会利用「上下文」推断参数类型:

let nums: number[] = [1, 2, 3];
nums.forEach((n) => console.log(n * 2)); // n 自动推断为 number
// 输出:2 / 4 / 6

const handler: (x: number) => number = (x) => x + 1;
console.log(handler(10)); // 输出:11

何时需要显式标注

推断并非万能:复杂对象、对外 API 与函数参数建议显式写类型,让意图更明确、报错位置更准确:

interface User {
  name: string;
  age: number;
}
const users: User[] = [{ name: "张三", age: 20 }];
// 若缺少 age,编译器会立刻提示 users 中的对象不符合 User
console.log(users[0].name); // 输出:张三

小结

类型推断让 TypeScript「写起来像 JavaScript 一样自由」,同时保留类型检查。原则是:简单场景放心交给推断,复杂或暴露给外部的接口则显式标注类型。

笔记加载中…