TS2554报错:对象属性全设为可选仍提示参数数量不匹配如何解决?
问题原因
你对问题的判断完全正确:对象属性可选 ≠ 入参对象本身可选。
你当前的fetchClaimDetails函数的入参规则是:必须传入1个符合fetchClaimDetailsQueryParams类型的对象,你只是允许这个对象的属性为空,并没有允许不传这个对象本身,所以直接无参调用就会触发TS2554参数数量不匹配的报错。
解决方案
有两种常用的修复方式,根据你的使用场景选择即可:
方案1:调用时传入空对象
不需要修改函数定义,调用时传入空对象即可符合类型要求,空对象本身是符合所有属性都是可选的接口定义的:
useEffect(() => { fetchClaimDetails({}); }, []);
方案2:将入参对象设为可选并设置默认值
如果你希望保持无参调用的写法,可以给整个入参对象设置默认值为空对象,此时TypeScript会自动将该参数识别为可选参数:
// 仅修改函数定义的参数末尾,添加 = {} 即可 const fetchClaimDetails = async ({ clientClaimId = null, status = null }: fetchClaimDetailsQueryParams = {}) => { // 原有逻辑不变 }
修改后你原来的fetchClaimDetails()无参调用写法就可以正常运行,不传参数时会自动用空对象作为入参,解构时会触发你预先设置的属性默认值。
内容的提问来源于stack exchange,提问作者Jamie Hutber
相关产品推荐
相关产品推荐

