Задать вопрос
@SVAY

Неверное сворачивание типов TypeScript?

При использование middleware типизация body исчезает и появляется ошибка. Без него ошибки не наблюдается, я полагаю TypeScript сворачивает типы в более общий интерфейс и затем body отбрасывается, но почему это происходит мне не понятно. Что бы словить ошибку нужно раскомментить строку с middleware. TS Playground
interface Schema<T> { t: T }
declare const s: Schema<{ hello: string }>

interface BaseContext { readonly request: any }
type Middleware = (context: BaseContext, next: () => Middleware) => any
interface RouteOptions { readonly body?: any; readonly middleware?: Middleware[]; }

type SpecifyContext<C extends BaseContext, O extends RouteOptions> =
  { readonly [K in keyof C]: K extends 'request' ? any : C[K] } & (O['body'] extends Schema<infer T> ? { body: T } : {});

type RouteHandler<C extends BaseContext, O extends RouteOptions> = (context: SpecifyContext<C, O>) => any;

class Mini {
  get<const O extends RouteOptions>(path: string, handler: RouteHandler<BaseContext, O>, options?: O): Mini { return this; }
}

/* Mini.get<RouteOptions> */
const mini = new Mini();
mini.get('/example', ctx => ctx.body,  // <-- Error here
  {
    body: s, 
    middleware: [(ctx, next) => next()],
  } as const,
);

/* Mini.get<{ readonly body: Schema<{ hello: string; }, { hello: string; }>; }> */
mini.get('/example', ctx => ctx.body, { body: s } as const,);
  • Вопрос задан
  • 436 просмотров
Подписаться 2 Средний 1 комментарий
Решения вопроса 1
Alexandroppolus
@Alexandroppolus
кодир
Playground

что поменялось: сделал RouteOptions как генерик, туда залетает тип B для body

метод get в классе Mini стал генериком по этому типу для body

далее вместо всего типа для RouteOptions, везде передается и доезжает до SpecifyContext этот самый B
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы