microsoft / microsoft/TypeScript

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

Offen
#59,346 3 Kommentare 1 Reaktion 1 zugewiesene Person Auf GitHub ansehen

@ahejlsberg arbeitet bereits daran.

Seit 26.7.2024.

Suggestion
Vorherrschende Sprache
Go
Sterne
111k
Forks
14.4k
Ø Merge
1 T. 19 Std.
Gemergte PRs (30 T.)
117

Beschreibung

🔍 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.
}

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.