Write-Type-Provider
How to write your own type provider
Things to keep in mind when implementing a custom type provider:
Type Contravariance
Whereas exhaustive type narrowing checks normally rely on never to represent
an unreachable state, reduction in type provider interfaces should only be done
up to unknown.
The reasoning is that certain methods of FastifyInstance are
contravariant on TypeProvider, which can lead to TypeScript surfacing
assignability issues unless the custom type provider interface is
substitutable with FastifyTypeProviderDefault.
For example, FastifyTypeProviderDefault will not be assignable to the following:
export interface NotSubstitutableTypeProvider extends FastifyTypeProvider {
// bad, nothing is assignable to `never` (except for itself)
validator: this['schema'] extends /** custom check here**/ ? /** narrowed type here **/ : never;
serializer: this['schema'] extends /** custom check here**/ ? /** narrowed type here **/ : never;
}
Unless changed to:
export interface SubstitutableTypeProvider extends FastifyTypeProvider {
// good, anything can be assigned to `unknown`
validator: this['schema'] extends /** custom check here**/ ? /** narrowed type here **/ : unknown;
serializer: this['schema'] extends /** custom check here**/ ? /** narrowed type here **/ : unknown;
}