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
相关产品推荐
相关产品推荐

