@justedoit

Как сделать динамический тип с опциональными полями?

Есть вот такой интерфейс со сгенерированными типами из openapi.
export interface paths {
  '/api/v1/geo_points': {
    get?: never;
    put?: never;
    post: operations['GetGeoPoints'];
    delete?: never;
    options?: never;
    head?: never;
    patch?: never;
    trace?: never;
  };
  '/api/v1/locations': {
    get: operations['GetPropertiesByName'];
    put?: never;
    post?: never;
    delete?: never;
    options?: never;
    head?: never;
    patch?: never;
    trace?: never;
  };
  '/api/v1/locations/point': {
    get?: never;
    put?: never;
    post: operations['GetAreasInPoint'];
    delete?: never;
    options?: never;
    head?: never;
    patch?: never;
    trace?: never;
  };
};


Хочется написать общий динамический тип со схемой post запроса, что-то типо такого:
type Schemas<P extends keyof paths> = paths[P]['post']['requestBody'] // etc..


Проблема в том, что в интерфейсе paths для каждой ручки не опциональное поле только то которые используется в данном запросе по спецификации, остальные опциональны. В связи с этим динамическое подставление path в примере выше будет выдавать ошибку при обращение к тем полям которые идут после типа http запроса. В примере выше после обращения к requestBody TS выдаст ошибку, т.к post может быть опциональным.

Мб есть вариант написать как нибудь что-бы это работало с динамическим path?
  • Вопрос задан
  • 80 просмотров
Решения вопроса 1
Alexandroppolus
@Alexandroppolus
кодир
можно через infer:

type Schemas<P extends keyof paths> = paths[P]['post'] extends {requestBody: infer R} ? R : never;


playground
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы