-
Notifications
You must be signed in to change notification settings - Fork 13.1k
Closed
Labels
BugA bug in TypeScriptA bug in TypeScriptFixedA PR has been merged for this issueA PR has been merged for this issue
Milestone
Description
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]
kimjoar
Metadata
Metadata
Assignees
Labels
BugA bug in TypeScriptA bug in TypeScriptFixedA PR has been merged for this issueA PR has been merged for this issue