Skip to content

string index signature inferring from symbol key #26183

Closed
@yortus

Description

@yortus

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

No one assigned

    Labels

    DuplicateAn existing issue was already created

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions