Skip to content

Higher order inference for lookup types does not work #20124

@weswigham

Description

@weswigham

Inference for T[K] to U[Y] was supposedly introduced in #18391, however looking over the code, this case in inferTypes in checker.ts:

                else if (source.flags & TypeFlags.IndexedAccess && target.flags & TypeFlags.IndexedAccess) {
                    inferFromTypes((<IndexedAccessType>source).objectType, (<IndexedAccessType>target).objectType);
                    inferFromTypes((<IndexedAccessType>source).indexType, (<IndexedAccessType>target).indexType);
                }

is unreachable code.
This is because the first if statement in the if-else if chain is

if (target.flags & TypeFlags.TypeVariable) {

which is true when the target is TypeFlags.IndexedAccess, as TypeFlags.TypeVariable = TypeFlags.TypeParameter | TypeFlags.IndexedAccess.

TypeScript Version: 2.6.1-insiders.20171019 (current playground)

Code

declare function get<U, Y extends keyof U>(x: U, y: Y): U[Y];
declare function find<T, K extends keyof T>(o: T[K]): [T, K];

function impl<A, B extends keyof A>(a: A, b: B) {
    const item = get(a, b);
    return find(item);
}

Expected behavior:
impl has return type [A, B]

Actual behavior:
impl has return type [{}, never]

Metadata

Metadata

Assignees

Labels

BugA bug in TypeScriptFixedA PR has been merged for this issue

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions