如何为isString函数编写正确JSDoc签名以实现类型窄化?
实现能触发类型窄化的字符串类型守卫
要让if(isString(x)){}代码块内的x被识别为string类型,你需要使用类型谓词的JSDoc写法,而非之前的联合函数类型定义。正确实现如下:
/** * 检查输入是否为字符串类型 * @param {any} obj - 待检查的对象 * @returns {obj is string} 输入为字符串时返回true,否则返回false */ function isString(obj) { return Object.prototype.toString.call(obj) === "[object String]"; }
为什么之前的写法无效
你之前使用的((obj:string)=>true)|((obj:any)=>false)联合类型,仅描述了函数的输入输出对应关系,但没有告诉类型检查器这是一个类型守卫,因此无法触发类型窄化逻辑,if块内的x类型不会被自动更新。
而@returns {obj is string}这个JSDoc标记,明确告知类型检查器:当函数返回true时,参数obj的类型就是string,类型检查器会据此在if块内自动将x的类型窄化为string。
内容的提问来源于stack exchange,提问作者Carlos Pinzón
相关产品推荐
相关产品推荐

