Skip to content

3.5.1 regression in mapped types on tuples #31736

@SpringNyan

Description

@SpringNyan

TypeScript Version: 3.5.1

Search Terms: regression, mapped types, tuples

Code

type Model<TProps = any> = {
    props: TProps;
};

type ExtractModelProps<TModel extends Model> = TModel extends Model<
    infer TProps
>
    ? TProps
    : never;

type Options<TType extends string = string, TModel extends Model = Model> = {
    type: TType;
    getModel: () => TModel;
};

type ExtractPropsListFromOptionsList<TOptionsList extends Options[]> = {
    [P in keyof TOptionsList]: TOptionsList[P] extends Options
    ? ExtractModelProps<ReturnType<TOptionsList[P]["getModel"]>>
    : never
};

// expected: [string, number]
type PropsList = ExtractPropsListFromOptionsList<[
    {
        type: 'foo',
        getModel: () => {
            props: string
        }
    },
    {
        type: 'bar',
        getModel: () => {
            props: number
        }
    }
]>;

Expected behavior:
PropsList should be [string, number], no error emitted.

Actual behavior:
In 3.4.5, it works as expected.
In 3.5.1, it emits errors at ExtractModelProps<ReturnType<TOptionsList[P]["getModel"]>>:

Type 'ReturnType<TOptionsList[P]["getModel"]>' does not satisfy the constraint 'Model<any>'.
  Type 'unknown' is not assignable to type 'Model<any>'.
    Type 'ReturnType<TOptionsList[keyof TOptionsList]["getModel"]>' is not assignable to type 'Model<any>'.
      Type 'unknown' is not assignable to type 'Model<any>'.
        Type 'ReturnType<TOptionsList[string | number | symbol]["getModel"]>' is not assignable to type 'Model<any>'.
          Type 'unknown' is not assignable to type 'Model<any>'.
            Type 'ReturnType<TOptionsList[string]["getModel"]> | ReturnType<TOptionsList[number]["getModel"]> | ReturnType<TOptionsList[symbol]["getModel"]>' is not assignable to type 'Model<any>'.
              Type 'ReturnType<TOptionsList[string]["getModel"]>' is not assignable to type 'Model<any>'.
                Type 'unknown' is not assignable to type 'Model<any>'.ts(2344)

If I change TOptionsList[P] extends Options to P extends number, it won't emit errors. But the result of PropsList is [never, never].

Playground Link:
https://www.typescriptlang.org/play/index.html#src=type%20Model%3CTProps%20%3D%20any%3E%20%3D%20%7B%0D%0A%20%20%20%20props%3A%20TProps%3B%0D%0A%7D%3B%0D%0A%0D%0Atype%20ExtractModelProps%3CTModel%20extends%20Model%3E%20%3D%20TModel%20extends%20Model%3C%0D%0A%20%20%20%20infer%20TProps%0D%0A%3E%0D%0A%20%20%20%20%3F%20TProps%0D%0A%20%20%20%20%3A%20never%3B%0D%0A%0D%0Atype%20Options%3CTType%20extends%20string%20%3D%20string%2C%20TModel%20extends%20Model%20%3D%20Model%3E%20%3D%20%7B%0D%0A%20%20%20%20type%3A%20TType%3B%0D%0A%20%20%20%20getModel%3A%20()%20%3D%3E%20TModel%3B%0D%0A%7D%3B%0D%0A%0D%0Atype%20ExtractPropsListFromOptionsList%3CTOptionsList%20extends%20Options%5B%5D%3E%20%3D%20%7B%0D%0A%20%20%20%20%5BP%20in%20keyof%20TOptionsList%5D%3A%20TOptionsList%5BP%5D%20extends%20Options%0D%0A%20%20%20%20%3F%20ExtractModelProps%3CReturnType%3CTOptionsList%5BP%5D%5B%22getModel%22%5D%3E%3E%0D%0A%20%20%20%20%3A%20never%0D%0A%7D%3B%0D%0A%0D%0A%2F%2F%20expected%3A%20%5Bstring%2C%20number%5D%0D%0Atype%20PropsList%20%3D%20ExtractPropsListFromOptionsList%3C%5B%0D%0A%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20type%3A%20'foo'%2C%0D%0A%20%20%20%20%20%20%20%20getModel%3A%20()%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20props%3A%20string%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%2C%0D%0A%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20type%3A%20'bar'%2C%0D%0A%20%20%20%20%20%20%20%20getModel%3A%20()%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20props%3A%20number%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%5D%3E%3B%0D%0A

Seems the version of Playground is not 3.5.1 for now.

Related Issues:

Metadata

Metadata

Assignees

Labels

BugA bug in TypeScriptFix AvailableA PR has been opened for this issue

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions