You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中如何让回调仅在条件为真时执行并推断变量已定义?

让TypeScript推断回调内变量已定义的解决方案

你当前的doIf函数无法让TypeScript推断回调内myVar的类型,因为函数接收的condition只是一个普通布尔值,TypeScript无法把这个布尔值和myVar的类型缩小逻辑关联起来。要实现这个效果,需要通过泛型+类型谓词或者调整函数设计,让TypeScript能跟踪类型缩小的上下文。

方案一:基于类型谓词的函数改造

重新定义doIf,让它接收一个返回类型谓词的函数,这样TypeScript能识别条件对应的类型缩小:

function doIf<T>(condition: () => condition is T, callback: () => void): void {
  if (condition()) {
    callback();
  }
}

使用方式:

const myVar: string | undefined = maybeGetString();

doIf(() => myVar !== undefined, () => {
  console.log(myVar.toLowerCase()); // 无报错,TypeScript推断myVar为string
});

方案二:直接传递变量的专用函数

如果你的场景主要是判断变量是否非undefined,可以写一个更针对性的函数,直接把变量传入,让函数内部处理类型缩小:

function doIfDefined<T>(value: T | undefined, callback: (value: T) => void): void {
  if (value !== undefined) {
    callback(value);
  }
}

使用方式:

const myVar: string | undefined = maybeGetString();
doIfDefined(myVar, (str) => {
  console.log(str.toLowerCase()); // str被推断为string,无报错
});

为什么原写法不行?

原doIf的condition参数只是一个布尔值,当你传入myVar !== undefined时,这个布尔值和myVar的类型关联在函数调用时就断开了。TypeScript无法知道这个布尔值代表的是myVar已定义的条件,所以在回调函数里依然认为myVar可能是undefined。

内容的提问来源于stack exchange,提问作者Felix ZY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 14:30:10