Microsoft/TypeScript

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

Open

#48,217 opened on 2022幎3月11日

GitHub で芋る
 (1 comment) (0 reactions) (0 assignees)TypeScript (6,726 forks)batch import
BugDomain: enumHelp Wanted

Repository metrics

Stars
 (48,455 stars)
PR merge metrics
 (平均マヌゞ 6d 17h) (30d で 9 merged PRs)

説明

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.

コントリビュヌタヌガむド