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 一样自由」,同时保留类型检查。原则是:简单场景放心交给推断,复杂或暴露给外部的接口则显式标注类型。