Microsoft/TypeScript

Mapping with enum key type and literal value type gives not assignable error.

Open

#48 217 ouverte le 11 mars 2022

Voir sur GitHub
 (1 commentaire) (0 réactions) (0 assignés)TypeScript (6 726 forks)batch import
BugDomain: enumHelp Wanted

Métriques du dépôt

Stars
 (48 455 stars)
Métriques de merge PR
 (Merge moyen 6j 17h) (9 PRs mergées en 30 j)

Description

Bug Report

🔎 Search Terms

map enum key literal value

🕗 Version & Regression Information

  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about typing for maps.

⏯ Playground Link

Playground link with relevant code

💻 Code

// We can quickly address your report if:
//  - The code sample is short. Nearly all TypeScript bugs can be demonstrated in 20-30 lines of code!
//  - It doesn't use external libraries. These are often issues with the type definitions rather than TypeScript bugs.
//  - The incorrectness of the behavior is readily apparent from reading the sample.
// Reports are slower to investigate if:
//  - We have to pare too much extraneous code.
//  - We have to clone a large repo and validate that the problem isn't elsewhere.
//  - The sample is confusing or doesn't clearly demonstrate what's wrong.

export enum E {
    'a-b-c' = 'abc.com',
    'def' = 'def.com',
}

export type M = {
    [e in E]?: 'literal';
}

const m0: M = {
    [E['a-b-c']]: 'literal', // error here
    [E.def]: 'literal' // no error
};

export {m0};

🙁 Actual behavior

When use Enum['value'] as the key of a mapping, values assigned to string literal types are not correctly recognized. The string literal is always lifted as string type and there is an error Type of computed property's value is 'string', which is not assignable to type '"literal"'.

However, if Enum.value form is used as the mapping key, everything works fine.

🙂 Expected behavior

The aforementioned error should not occur. Type check should be consistent when using Enum['value'] and Enum.value.

Guide contributeur