TypeScript:如何让函数返回正确类型并根据条件自动推导返回值
实现TypeScript根据if语句自动推导返回值类型
这其实是TypeScript里**类型收窄(Type Narrowing)**的典型场景,你可以通过内置类型守卫或者自定义类型守卫,让TS自动识别if语句后的变量具体类型,下面给你具体的实现方案:
一、使用typeof类型守卫(最适合基础类型场景)
针对你提到的string | number联合类型,直接用typeof判断就能让TS自动收窄类型,示例代码如下:
// 定义返回string | number的函数 function getRandomValue(): string | number { return Math.random() > 0.5 ? "TypeScript" : 996; } // 使用函数并进行类型收窄 const v = getRandomValue(); if (typeof v === "number") { // 这里TS会自动推导v的类型为number console.log(v.toFixed(1)); // 可以安全调用number专属方法,不会报错 } else { // 这里v的类型会被自动推导为string console.log(v.length); // 同理可以调用string的方法 }
原理很简单:TypeScript原生识别typeof v === "number"这种条件表达式作为类型守卫,会在对应的代码块里把变量的类型从联合类型收窄为具体的子类型。
二、自定义类型守卫(适合复用或复杂场景)
如果你的判断逻辑比较复杂,或者需要在多个地方复用这个类型判断,可以自定义一个类型守卫函数:
function isNumber(value: string | number): value is number { return typeof value === "number"; } const v = getRandomValue(); if (isNumber(v)) { // 这里TS同样会推导v为number类型 console.log(v * 2); }
这个value is number是类型谓词,告诉TS当函数返回true时,传入的value就是number类型,这样TS就能正确推导变量类型了。
注意事项
- 尽量避免用类型断言(比如
v as number)来强制指定类型,因为这样会跳过TS的类型检查,容易埋下类型错误的隐患; - 除了
typeof,TS还支持instanceof、in操作符作为类型守卫,分别适用于类实例和对象属性的类型收窄场景。
内容的提问来源于stack exchange,提问作者undefined
相关产品推荐
相关产品推荐

