書式タイププロバイダー
独自タイプのプロバイダーを書く方法
カスタムのタイププロバイダーを実装するときの注意事項
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;
}