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?
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]
dondesomeNumber
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
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