TypeScript中函数返回类型未自动推断问题咨询
问题解答
这是预期行为吗?
是预期行为。TypeScript的多余属性检查(Excess Property Checks)仅针对直接赋值给明确类型的对象字面量生效。当你通过回调函数返回对象时,TS会认为该对象可能在后续逻辑中被修改或扩展,属于“间接赋值”场景,因此默认不会触发多余属性检查,代码补全也会因为类型推断不够严格而失效。
如何无需显式类型转换保留类型检查?
有两种简洁的方式解决这个问题:
1. 定义复用的类型别名,明确回调返回类型
先把props的类型抽成独立别名,再在接口中复用,让TS严格校验回调的返回值:
type PropsConfig = { type: string }; interface Definition { props?: PropsConfig | ((originalValue: string) => PropsConfig) } function example(definition: Definition) { return definition } // 此时回调返回多余属性会触发错误,代码补全正常 example({ props: (val) => { return { type: 'string', extra: 'invalid' } // 报错:对象文字可以只指定已知属性,并且“extra”不在类型“PropsConfig”中 } })
2. 给回调函数显式标注返回类型
如果不想新增类型别名,直接在回调函数上标注返回类型,同样能触发严格检查:
interface Definition { props?: { type: string } | ((originalValue: string) => { type: string }) } function example(definition: Definition) { return definition } example({ props: (val): { type: string } => { return { type: 'string', extra: 'invalid' } // 报错:多余属性“extra”不存在于类型“{ type: string }”中 } })
这两种方式都不需要显式类型转换,就能让TS对回调返回的对象执行和直接传入对象字面量一致的类型校验,同时恢复代码补全功能。
内容的提问来源于stack exchange,提问作者Marcos Sandrini
相关产品推荐
相关产品推荐

