如何在TypeScript中利用对象的另一个键定义该对象键的类型?
问题描述
我定义了如下TypeScript类型签名:
import { z, ZodObject, ZodRawShape } from 'zod'; export type DefinitionObject<T extends ZodRawShape> = { validator: ZodObject<T>; htmlFn: (value: z.infer<typeof validator> & { locale?: string; }) => JSX.Element; };
想要让htmlFn的参数类型依赖同对象中validator的类型,但TypeScript抛出两个错误:
Cannot find name 'validator'.ts (2304) Parameter 'value' of exported function has or is using private name 'validator'.ts (4078)
需要在类型签名里实现类似this.validator的关联效果,该怎么处理?
解决方案
问题出在你试图在类型上下文里直接引用对象属性名validator,TypeScript不支持这种写法。不过你已经通过泛型T约束了ZodRawShape,而validator的类型是ZodObject<T>,所以可以直接用z.infer<ZodObject<T>>来获取validator对应的推断类型,替代z.infer<typeof validator>即可。
修正后的代码如下:
import { z, ZodObject, ZodRawShape } from 'zod'; export type DefinitionObject<T extends ZodRawShape> = { validator: ZodObject<T>; htmlFn: (value: z.infer<ZodObject<T>> & { locale?: string; }) => JSX.Element; };
这样htmlFn的参数类型就会和validator的类型自动关联——当你传入不同的ZodObject作为validator时,value的类型会自动对应validator的推断结果,同时保留额外的locale可选属性。
内容的提问来源于stack exchange,提问作者Harshal Patil
相关产品推荐
相关产品推荐

