Skip to content

[proposal] Non widened string values should be valid enum values, like widened string valuesΒ #59346

Open

Description

πŸ” Search Terms

enum, string

βœ… Viability Checklist

⭐ Suggestion

TypeScript accepts widened strings as enum values, but refuses to accept non widened strings as enum values. I propose to relax this constraint allowing widened and non widened strings as valid enum values.

πŸ“ƒ Motivating Example

At the moment TypeScript accepts widened strings as valid enum values.

// FILE:./case1.ts
export const Case1_ImagePngType = 'image/png'

// Emitted in FILE:./case1.d.ts as
export declare const Case1_ImagePngType = "image/png"

// FILE:./test1.ts
import {Case1_ImagePngType} from './case1.js'

enum Case1 {
  // WORKS FINE
  Png = Case1_ImagePngType,
}

Trying to use a non widened string results in a compiler error.

// FILE:./case2.ts
export const Case2_ImageJpegType = 'image/jpeg' as const

// Emitted in FILE:./case2.d.ts as
export declare const Case2_ImageJpegType: "image/jpeg"

// FILE:./test2.ts
import {Case2_ImageJpegType} from './case2.js'

enum Case2 {
  // FAILS WITH: Type 'string' is not assignable to type 'number' as required for computed enum member values.
  Jpeg = Case2_ImageJpegType,
}

πŸ’» Use Cases

Given a consumer project P1 using exported widened strings values from a consumed library L1, if L1 annotates the exported strings values as const, L1 breaks P1.

Given that a widened string value is a valid enum value, a "stricter" non widened string (a subset of the widened one) should be a valid enum value too.

// FILE:./lib-1.ts
export const ImagePngType = 'image/png'

// FILE:./lib-2.ts
export const ImageJpegType = 'image/jpeg' as const

// FILE:./project.ts
enum MyEnum {
  Png = ImagePngType, // FINE.
  Jpeg = ImageJpegType, // SHOULD BE FINE, BUT ERROR AT THE MOMENT.
}

Activity

  1. daniele-orlando commented on Jul 18, 2024

    @daniele-orlando
    Author

    Follows from #59187.

  2. changed the title [-]Non widened string value should be valid enum values, like widened string value[/-] [+][proposal] Non widened string value should be valid enum values, like widened string value[/+] on Jul 18, 2024
  3. changed the title [-][proposal] Non widened string value should be valid enum values, like widened string value[/-] [+][proposal] Non widened string values should be valid enum values, like widened string values[/+] on Jul 18, 2024
  4. RyanCavanaugh commented on Jul 26, 2024

    @RyanCavanaugh
    Member

    Anders Hejlsberg (@ahejlsberg) this seemed like a simple oversight to me but wasn't 100% sure. Can you weigh in?

  5. RyanCavanaugh commented on Jul 29, 2024

    @RyanCavanaugh
    Member

    Discussion notes:

    • Allow interpreting const x: "foo" as a constant source for "foo"
    • Allow seeing declare const x = "foo" as const in declaration files
      • Eventually change the declaration emitter to use that format instead
  6. added
    SuggestionAn idea for TypeScript
    Fix AvailableA PR has been opened for this issue
    and removed
    Needs InvestigationThis issue needs a team member to investigate its status.
    on Jul 30, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

SuggestionAn idea for TypeScript

Type

No type

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions