Skip to Content

编写类型提供器

在实现自定义 类型提供器 时需要注意的事项:

类型逆变

虽然详尽的类型细化检查通常依赖于 never 来表示不可达状态,但在类型提供器接口中进行缩减时只能减少到 unknown

原因在于某些 FastifyInstance 方法在 TypeProvider 上是逆变的,这可能导致 TypeScript 显示可赋值性问题,除非自定义类型提供器接口可以替换为 FastifyTypeProviderDefault

例如,FastifyTypeProviderDefault 不会赋值给以下接口:

export interface NotSubstitutableTypeProvider extends FastifyTypeProvider { // 错误,没有任何东西可被赋值到 `never`(除了它自己) validator: this['schema'] extends /** 自定义检查这里**/ ? /** 精简类型这里 **/ : never; serializer: this['schema'] extends /** 自定义检查这里**/ ? /** 精简类型这里 **/ : never; }

除非改为:

export interface SubstitutableTypeProvider extends FastifyTypeProvider { // 正确,任何东西都可以赋值给 `unknown` validator: this['schema'] extends /** 自定义检查这里**/ ? /** 精简类型这里 **/ : unknown; serializer: this['schema'] extends /** 自定义检查这里**/ ? /** 精简类型这里 **/ : unknown; }