TypeScript部分类型化解构对象参数:能否简化函数签名?
更简洁的解构对象参数函数签名写法
针对你给出的TypeScript函数,确实有更简洁的写法,既不用在类型里显式声明a、b,还能满足类型约束需求,下面是两种实用方案:
方案1:用索引签名允许任意属性(适合不关心a、b具体类型的场景)
如果a、b可以是任意类型,只需要强制c为number,可以用索引签名省略a、b的显式声明:
function foo({ a, b, c }: { c: number; [key: string]: unknown }) { // 你的业务逻辑 }
这里[key: string]: unknown表示除了c之外,对象可以有任意字符串键的属性,a、b会被自动推断为unknown类型。
方案2:用泛型保留a、b的原始类型(需要类型推断的场景)
如果希望TypeScript自动推断a、b的实际类型,同时强制c必须是number,可以用泛型实现:
function foo<T extends { c: number }>({ a, b, c }: T) { // 这里a、b的类型会根据调用时传入的参数自动推断 } // 调用示例: foo({ a: "test", b: true, c: 456 }); // a会被推断为string,b为boolean
这种写法不仅省略了a、b的类型声明,还能让函数获得更精准的类型提示,灵活性更高。
另外要注意:你原始代码里的类型声明(只写a,、b,不指定类型)在严格模式下是不合法的,TypeScript会抛出类型错误,所以必须通过上述方式或显式指定类型来修正。
内容的提问来源于stack exchange,提问作者yigal
相关产品推荐
相关产品推荐

