You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 02:54:04