microsoft / microsoft/TypeScript

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

Abierto
#59,346 3 comentarios 1 reacción 1 asignado Ver en GitHub

@ahejlsberg ya está trabajando en esto.

Desde el 26/7/2024.

Suggestion
Lenguaje dominante
Go
Estrellas
111k
Forks
14.4k
Merge medio
1 d 19 h
PR fusionados (30 d)
117

Descripción

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

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.