«нажимные» типы в Typescript

#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