¿Cómo convertir tipos de cadenas mecanografiadas en una matriz de cadenas?

2 minutos de lectura

Tengo este tipo:

type myCustomType = "aaa" | "bbb" | "ccc";

Necesito convertirlo en una matriz como esta:

["aaa", "bbb", "ccc"]

¿Cómo puedo hacer esto en mecanografiado?

  • No es posible, los tipos no están en el código emitido. Pero podría hacerlo al revés: defina la matriz y luego cree un tipo a partir de ella.

    – Cierto rendimiento

    22 de enero de 2020 a las 10:10

  • @TJCrowder const arr = ["aaa", "bbb", "ccc"] as const; type arrTypes = typeof arr[number];

    – Cierto rendimiento

    22 de enero de 2020 a las 10:14

  • @CertainPerformance – Ah… Me perdí el as const parte. Creo que sería una buena respuesta, sugiero publicarla.

    –TJ Crowder

    22 de enero de 2020 a las 10:15


  • @CertainPerformance Bien, gracias por la respuesta rápida. Iré con esa solución entonces, eso también podría resolver mi escenario 🙂

    – Diemauerdk

    22 de enero de 2020 a las 10:16

Avatar de usuario de CertainPerformance
Cierto Rendimiento

Los tipos no existen en el código emitido; no se puede pasar de un escribe a una formación.

Pero podrías ir al revés, en algunas situaciones. Si la matriz no es dinámica (o el verificador de tipos puede determinar completamente sus valores en el momento en que se inicializa), puede declarar la matriz as const (para que el tipo de la matriz sea ["aaa", "bbb", "ccc"] en vez de string[]), y luego cree un tipo a partir de él asignando sus valores desde arr[number]:

const arr = ["aaa", "bbb", "ccc"] as const;
type myCustomType = typeof arr[number];

aquí hay un ejemplo en el área de juegos.

  • Que hace [number] aquí significa?

    – Hombre murciélago

    7 de diciembre de 2020 a las 4:08

  • Evalúa a la unión de arr[0], arr[1]etc; arr[someNumber] donde someNumber es un número Es solo sintaxis de TypeScript, no JS.

    – Cierto rendimiento

    7 de diciembre de 2020 a las 4:10


  • que significa el as const ¿parte?

    – adrisons

    4 de mayo de 2021 a las 14:53

  • @adrisons Evita que TypeScript amplíe automáticamente el tipo a string[]y en su lugar lo mantiene como una tupla estática de ["aaa", "bbb", "ccc"]

    – Cierto rendimiento

    4 mayo 2021 a las 15:49

Por ejemplo:

  const themeMode = ['light', 'dark'] as const;
  type MainTheme = typeof themeMode[number];
  const values = [...themeMode];

  // iterate on themeMode as const assertion
  values.map((theme) => console.log(theme));

No puede hacerlo con un literal de cadena, pero puede hacerlo con una enumeración

enum MyEnum {
  "aaa",
  "bbb",
  "ccc",
}

Object.keys(MyEnum).forEach(key => {
  console.log(key);
})

Repro aquí: https://stackblitz.com/edit/typescript-uqvach

  • Eso no proporciona el tipo de unión que solicitó el OP. Utiliza una enumeración de manera fundamentalmente diferente a un tipo de unión.

    –TJ Crowder

    22 de enero de 2020 a las 10:16

¿Ha sido útil esta solución?