TypeScript中如何直接转换函数参数对象的payload属性类型?
如何在TypeScript中直接为解构的payload参数指定类型(无需额外接口)
嘿,我完全懂你不想创建一堆一次性接口的痛点——重复定义Args类确实有点啰嗦!先直接说结论:你原本写的{ payload: ItemSearchPayload }写法是不对的,因为这是把payload变量重命名成了ItemSearchPayload(相当于把参数名改成了类型名),根本不是给它指定类型。不过确实有更快捷的方式,不用额外创建接口:
正确的快捷写法:内联对象类型注解
你可以直接在解构参数的同时,给整个第二个参数指定一个内联的对象类型,这样就能精准给payload标注类型,还能保留解构的简洁:
getShopItems: async (parent, { payload }: { payload: ItemSearchPayload }, ctx: Context, info) => { // 这里payload会自动获得ItemSearchPayload的类型提示 // ...你的业务逻辑 }
如果这个参数里还有其他属性(比如分页的limit、offset),也可以一起加到内联类型里:
getShopItems: async ( parent, { payload, limit = 20, offset = 0 }: { payload: ItemSearchPayload; limit?: number; offset?: number }, ctx: Context, info ) => { // 所有解构出来的变量都有对应的类型提示 }
为什么这个写法可行?
TypeScript允许你在函数参数位置直接写对象类型,而不需要先定义接口或类型别名。这种内联写法完全等效于你之前定义Args接口的方式,但省去了额外的类型声明步骤,非常适合单次使用的场景。
额外小技巧:如果需要复用类似结构
如果多个 resolver 都用到了类似的参数结构(比如都有payload+分页参数),可以用一个复用的类型别名替代内联写法,避免重复代码:
type BaseResolverArgs<T> = { payload: T; limit?: number; offset?: number }; // 然后在resolver里使用: getShopItems: async (parent, { payload, limit, offset }: BaseResolverArgs<ItemSearchPayload>, ctx: Context, info) => { ... } getUserItems: async (parent, { payload, limit, offset }: BaseResolverArgs<UserSearchPayload>, ctx: Context, info) => { ... }
这样既保持了简洁,又能复用通用的参数结构,比每个resolver都写内联类型更高效。
内容的提问来源于stack exchange,提问作者Artem Zakharov
相关产品推荐
相关产品推荐

