Typescript带默认参数的泛型类型推断报错问题求助
问题成因
基础示例报错原因
泛型的类型参数是由调用方决定的,你为参数v设置了默认值'cat'(string类型),但调用方完全可以手动指定T为任意和string无关的类型(比如number),此时默认值的类型和泛型约束冲突,因此TypeScript抛出2322错误。
业务代码报错原因
你的Output泛型未设置默认类型,调用方可以任意指定该泛型的实际类型,但默认的effect返回值类型固定为schema本身的输出类型,和调用方可能指定的Output类型不兼容,因此触发报错。
解决方案
基础示例修复
给泛型添加默认类型,同时对默认值做兼容断言:
const simpleExample = <T = string>(v: T = 'cat' as T) => { return v; };
业务代码修复
给Output泛型添加匹配默认逻辑的默认类型,同时对默认effect做安全类型断言:
const createHooks = < Shape extends z.ZodRawShape, Z extends z.ZodObject<Shape, 'strict'>, // 新增Output默认类型,和默认transform的返回值类型对齐 Output extends z.ZodTypeAny = Z['_output'] >( schema: Z, effect: (s: Z) => z.ZodEffects<Z, Output> = (s: Z) => s.transform((i) => i) as unknown as z.ZodEffects<Z, Output> ) => <Source, FProps extends { [k: string]: Record<string, any> }>({ name, getInstanceKey, load, fieldProps, }: { name: string; getInstanceKey: (s: Source) => string; load: (s: Source) => Z['_input']; fieldProps: FProps; }) => { // 业务逻辑保持不变 return { } }
改动说明
- 泛型默认类型仅在调用方未传入自定义
effect、未手动指定Output类型时生效,不会影响自定义场景的类型推导 - 对默认
effect的断言是安全的:默认场景下Output就是Z['_output'],类型完全匹配 - 传入自定义
effect时,如果返回值类型和你声明的Output不匹配,TypeScript依然会正常抛出报错,符合你的类型校验要求。
内容的提问来源于stack exchange,提问作者exrhizo
相关产品推荐
相关产品推荐

