JS项目用tsc校验时,带默认值的匿名函数参数如何标注类型?
解决Vuex Getter深层匿名函数的类型标注问题
针对JS项目用tsc做类型校验时,带默认值的参数被TS推断为单一类型(比如默认值5会被推断为number),导致调用parseInt触发类型错误,同时需要处理Vuex getter里深层匿名函数的场景,以下是几种实用方案:
1. 给参数添加类型断言
在使用参数时,通过类型断言明确告知TS参数的实际可能类型,适合快速修正单个报错:
const getters = { exampleGetter: (state) => { return (withProp = 5) => { // 断言参数为string|number,匹配parseInt的参数要求 return parseInt(withProp /** @type {string|number} */); }; } };
注意:断言必须符合实际运行时的参数类型,避免引入潜在的运行时风险。
2. 直接给匿名函数参数加JSDoc注释
无需重构为具名函数,直接在深层匿名函数的参数前添加JSDoc类型标注,既保留原有结构,又能让TS正确识别类型:
const getters = { exampleGetter: (state) => { // 直接在匿名函数参数上标注联合类型 return ((/** @type {string|number} */ withProp = 5) => { return parseInt(withProp); }); } };
3. 重构为具名函数(推荐长期维护)
如果该逻辑存在复用需求,或需要更高的可读性,把深层匿名函数抽成具名函数并添加JSDoc类型注释,再在getter中引用:
/** * @param {string|number} withProp */ function processValue(withProp = 5) { return parseInt(withProp); } const getters = { exampleGetter: (state) => { return processValue(state.targetValue); } };
这种方式更利于代码维护,类型注释也更清晰直观。
4. 临时屏蔽类型错误(应急场景)
如果只是需要临时跳过该报错,可使用// @ts-expect-error或// @ts-ignore注释,但不推荐长期使用——这会掩盖真正的类型问题:
const getters = { exampleGetter: (state) => { return (withProp = 5) => { // @ts-expect-error 临时跳过类型校验 return parseInt(withProp); }; } };
补充说明
TS根据参数默认值推断类型是预期行为:当默认值为5时,TS会默认认为参数始终是number类型,但如果实际运行时参数可能为string,就需要显式告知TS参数的联合类型,以上几种方法都能解决这个核心矛盾。
内容的提问来源于stack exchange,提问作者stackoverfloweth
相关产品推荐
相关产品推荐

