Closed
Description
π Search Terms
generic, widen, interface
π Version & Regression Information
This is the behavior in every version I tried, and I reviewed the FAQ for entries about Generics and Interfaces
β― Playground Link
π» Code
interface I {
a: Record<number, string[]>;
b: Record<number, number[]>;
}
const doSomething = <K extends keyof I>(key: K, value: I[K]) => {
if (key === 'a') {
console.log(key); // key is the literal 'a' βοΈ
console.log(value);
// ^^^^^ Record<number, string[]> | Record<number, number[]>
// expected: Record<number, string[]>
} else {
console.log(key); // key is the literal 'b' βοΈ
console.log(value);
// ^^^^^ Record<number, string[]> | Record<number, number[]>
// expected: Record<number, number[]>
}
}
π Actual behavior
value
in line 9 (when key
is 'a'
) is considered to be type Record<number, string[]> | Record<number, number[]>
.
accordingly, value
in line 14 (when key
is 'b'
) is also considered to be type Record<number, string[]> | Record<number, number[]>
π Expected behavior
value
in line 9 (when key
is 'a'
) should be considered to be type Record<number, string[]>
.
accordingly, value
in line 14 (when key
is 'b'
) should be considered to be type Record<number, number[]>
Additional information about the issue
No response
Metadata
Metadata
Assignees
Labels
No labels