Skip to content

Example definition in README fails to compile in Typescript strict mode #19

@jacobdr

Description

@jacobdr

Copied the examples directly, I get the following error:

node_modules/rest-ts-express/dist/index.d.ts:14:11 - error TS2430: Interface 'TypedRequest<T>' incorrectly extends interface 'Request<ParamsDictionary, any, any, ParsedQs>'.
  Types of property 'query' are incompatible.
    Type 'ExtractRuntimeType<T["query"]>' is not assignable to type 'ParsedQs'.
      Type 'void | (T["query"] extends (infer T)[] ? T extends [infer A] ? [ExtractBaseType<A>] : T extends [infer A, infer B] ? [ExtractBaseType<A>, ExtractBaseType<B>] : T extends [...] ? [...] : T extends [...] ? [...] : T extends [...] ? [...] : T extends [...] ? [...] : T extends [...] ? [...] : T extends [...] ? [...] : E...' is not assignable to type 'ParsedQs'.
        Type 'void' is not assignable to type 'ParsedQs'.
          Type 'void | { [x: string]: any; }' is not assignable to type 'ParsedQs'.
            Type 'void' is not assignable to type 'ParsedQs'.

14 interface TypedRequest<T extends EndpointDefinition> extends express.Request {
             ~~~~~~~~~~~~


Found 1 error.

Stepping down some levels, the definition of:

export declare type ExtractRuntimeType<T> = T extends undefined ? void : T extends Array<infer T> ? T extends [infer A] ? [ExtractBaseType<A>] : T extends [infer A, infer B] ? [ExtractBaseType<A>, ExtractBaseType<B>] : T extends [infer A, infer B, infer C] ? [ExtractBaseType<A>, ExtractBaseType<B>, ExtractBaseType<C>] : T extends [infer A, infer B, infer C, infer D] ? [ExtractBaseType<A>, ExtractBaseType<B>, ExtractBaseType<C>, ExtractBaseType<D>] : T extends [infer A, infer B, infer C, infer D, infer E] ? [ExtractBaseType<A>, ExtractBaseType<B>, ExtractBaseType<C>, ExtractBaseType<D>, ExtractBaseType<E>] : T extends [infer A, infer B, infer C, infer D, infer E, infer F] ? [ExtractBaseType<A>, ExtractBaseType<B>, ExtractBaseType<C>, ExtractBaseType<D>, ExtractBaseType<E>, ExtractBaseType<F>] : T extends [infer A, infer B, infer C, infer D, infer E, infer F, infer G] ? [ExtractBaseType<A>, ExtractBaseType<B>, ExtractBaseType<C>, ExtractBaseType<D>, ExtractBaseType<E>, ExtractBaseType<F>, ExtractBaseType<G>] : T extends [infer A, infer B, infer C, infer D, infer E, infer F, infer G, infer H] ? [ExtractBaseType<A>, ExtractBaseType<B>, ExtractBaseType<C>, ExtractBaseType<D>, ExtractBaseType<E>, ExtractBaseType<F>, ExtractBaseType<G>, ExtractBaseType<H>] : Array<ExtractBaseType<T>> : ExtractBaseType<T>;
declare type ExtractBaseType<T> = T extends rt.Runtype ? rt.Static<T> : T extends {
    new (...args: any[]): infer T;
} ? T : T extends any[] | Function ? T : T extends {
    [k: string]: any;
} ? {
    [K in keyof T]: ExtractRuntimeType<T[K]>;
} : T;

Changing the following:

export declare type ExtractRuntimeType<T> = T extends undefined ? void :
export declare type ExtractRuntimeType<T> = T extends undefined ? never :

fixes the issue for me.

Given I am new to the library and unable to assess risk and potential breaking effect of the change, I feel a bit uncomfortable making a PR at this time.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions