書式タイププロバイダー
独自タイプのプロバイダーを書く方法
カスタムのタイププロバイダーを実装するときの注意事項
Type Contravariance
通常、Type Narrowing チェックは never に依存して到達不能な状態を表しますが、タイププロバイダーインターフェイスの削減は unknown のみを上限として行う必要があります。
その理由は、FastifyInstance の特定のメソッドが TypeProvider に対して反変であり、カスタムのタイププロバイダーインターフェイスが FastifyTypeProviderDefault で置換できない限り、TypeScript が代入可能性の問題を明らかにする場合があるためです。
たとえば、FastifyTypeProviderDefault は次のように代入できません
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;
}
次のように変更する場合を除く
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;
}