编写类型提供器
在实现自定义 类型提供器 时需要注意的事项:
类型逆变
虽然详尽的类型细化检查通常依赖于 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;
}