Typescript API契约类型实例化过深问题排查与解决
解决TypeScript“类型实例化过深,可能无限”错误
我正在构建一个类似ts-rest的轻量API契约工具,移除了ts-rest中的冗余功能,并用JSON Schema替代Zod做校验。代码基于ts-rest修改而来,运行时完全正常,但TypeScript编译器抛出**"type instantiation is excessively deep and possibly infinite"**错误。
报错位置
错误触发在recursivelyRegisterRoutes函数的以下代码段:
if ("contract" in serverImpl && "routes" in serverImpl) { recursivelyRegisterRoutes( serverImpl.routes, serverImpl.contract, fastify ); }
尝试过的无效方案
升级到TypeScript 5.3版本,问题未得到解决。
最终解决方案
通过修改AppRouteImplementation类型定义修复了该问题,修改后的代码如下:
type AppRouteImplementation<T extends AppRoute> = Omit< RouteOptions< RawServerDefault, RawRequestDefaultExpression, RawReplyDefaultExpression, { Params: T['params'] extends infer R ? FromSchema<R extends JSONSchema ? R : never> : never Querystring: T['query'] extends infer R ? FromSchema<R extends JSONSchema ? R : never> : never Body: T extends AppRouteMutation ? T['body'] extends infer R ? FromSchema<R extends JSONSchema ? R : never> : never : never } >, 'method' | 'url' >
内容的提问来源于stack exchange,提问作者Manu
相关产品推荐
相关产品推荐

