-
Notifications
You must be signed in to change notification settings - Fork 12.9k
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