- 
                Notifications
    You must be signed in to change notification settings 
- Fork 13.1k
Closed
Labels
DuplicateAn existing issue was already createdAn existing issue was already created
Description
TypeScript Version: 3.0.1
Search Terms:
string index signature, symbol, inference
Code
// returns all the values in `obj` whose property keys are strings
declare function getStringPropValues<T>(obj: {[x: string]: T}): T[];
// A unique symbol used in objects below
const SYM = Symbol();
// v1 is number[] as expected
let v1 = getStringPropValues({ foo: 42, bar: 51 });
// v2 is (string | number)[] as expected
let v2 = getStringPropValues({ foo: 42, bar: 'hello' });
// v3 is (string | number)[]        <==== non-string key included in type inference
let v3 = getStringPropValues({ foo: 42, [SYM]: 'hello' });
// v4 is number[]                   <==== non-string key excluded from type constraint
let v4 = getStringPropValues<number>({ foo: 42, [SYM]: 'hello' });Expected behavior:
v3 is number[], since the [SYM] key is not part of the string index signature.
Actual behavior:
v3 is (string | number)[], implying that the [SYM] key belongs to the string index signature.
v1, v2 and v4 all behave as I would expect. Note in v4 the type parameter is given explicitly, and the [SYM] key is correctly excluded from the type constraint since it is not part of the string index signature. But this seems inconsistent with the behaviour of v3 where it is treated as if is does belong to the string index signature.
Metadata
Metadata
Assignees
Labels
DuplicateAn existing issue was already createdAn existing issue was already created