#typescript #typescript-typings #typescript-generics #fastify
Вопрос:
Я использую пакет fastify, где определения типов зависят от параметров конфигурации, которые вы для него установили (например, создаете ли вы сервер http или http2). Я хотел бы сохранить эти динамические типы в файлах, которые вызывает fastify (например, файл, который регистрирует маршруты).
// loader.ts
import fastify from 'fastify';
import registerApiRoutes from './registerApiRoutes';
export default function loader() {
return fastify({
http2: true,
})
.register(registerApiRoutes)
.listen();
}
// registerApiRoutes
export default function registerApiRoutes(fastify) {
fastify
.get(...);
.post(...);
}
Как мне добиться, чтобы параметр «fastify» в «registerApiRoutes.ts» имел правильный тип в зависимости от того, какие настройки я выбрал в «loader.ts»?
Ответ №1:
Используйте условные типы.
Пример:
interface FastifyConfiguration {
http2: boolean
}
interface Fastify {
get(): void
post(): void
}
interface Http2Fastify extends Fastify {
http2Only(): void
}
interface Http1Fastify extends Fastify {
http1Only(): void
}
declare function fastify<C extends FastifyConfiguration>(conf: C): C['http2'] extends true ? Http2Fastify : Http1Fastify