TypeScript 如何做类型推导
刚接触 TypeScript 的开发者,往往会被“类型推导”这个词弄得摸不着头脑——简单说,它就是 TypeScript 自带的“读心术”:不用你特意标注类型,它能从你写的代码里猜出变量、函数返回值该是什么类型。
变量的类型推导:从“给变量赋值”里猜类型
最常见的场景就是定义变量。比如你写 let userName = "小明",TypeScript 会自动把 userName 识别成字符串类型,之后如果想给它塞数字 userName = 123,编辑器会立刻报错。这就像你给朋友起了个“小敏”的昵称,大家默认她是女生,总不能突然说“这是个男生”,不符合大家的固有认知。

再比如 let age = 25,TypeScript 会认定 age 是数字类型,后续只能存数字。就算你写 const isStudent = true,它也能推导出布尔类型——毕竟常量的赋值是固定的,类型自然也确定。
函数参数与返回值的推导:从“函数怎么用”里猜类型
函数的类型推导更贴近实际开发。比如写一个简单的求和函数:
`typescript
function add(a: number, b: number) {
return a + b;
}
`
这里你没给返回值标类型,但 TypeScript 会自动从 a + b 推导返回值是数字,因为两个数字相加结果肯定是数字。要是你写的是拼接字符串的函数,比如 function sayHello(name) { return "你好," + name },它会从 name 和字符串拼接的结果,推导出返回值是字符串。
不过这里有个小细节:如果函数没写返回值,也没返回任何东西,比如 function logMsg(msg) { console.log(msg) },TypeScript 会推导出返回值是 void,也就是“没有返回值”的意思,这符合日常写日志的函数逻辑。
更复杂的场景:从“上下文环境”里猜类型
有时候推导会更灵活,TypeScript 会看代码的整体上下文。比如用数组存数据:let fruits = ["苹果", "香蕉", 3],这里有字符串也有数字,TypeScript 会把它推导成“联合类型数组”,也就是 (string | number)[],你既可以存字符串也可以存数字。
再比如回调函数的场景:const numbers = [1, 2, 3]; numbers.map(num => num * 2),TypeScript 知道 numbers 是数字数组,所以回调里的 num 自动是数字类型,你直接写 num 就不用标注类型,要是你想给 num 标成字符串,编辑器反而会报错。
还有对象的推导:let person = { name: "小丽", age: 30 },TypeScript 会把 person 变成一个固定结构的对象,你只能加 name 和 age 这两个属性,类型也分别是字符串和数字,不能多属性也不能改类型。
什么时候需要手动标类型?
当然,不是所有情况都靠推导就行。比如函数参数如果是 any 类型,或者你需要更严格的类型限制,比如 let userId: string = "1001",明确要求是字符串;或者你写的函数逻辑复杂,推导可能出错,比如 function getValue() { if (Math.random() > 0.5) return 1 else return "失败" },这时候推导出来是联合类型,要是你想固定返回数字,就得手动标类型。
总的来说,TypeScript 的类型推导就像一个贴心的搭档,能帮你省掉 80% 的类型标注工作,还能提前揪出错误。只要理解它是从“赋值、上下文、使用方式”里找类型规律,就能慢慢用熟,不会再被它的“读心术”搞懵。