Búsqueda de sitios web

typescript - Obtener arreglo de valores de tipo literal de cadena


Necesito obtener una lista completa de todos los valores posibles para un literal de cadena.

type YesNo = "Yes" | "No";
let arrayOfYesNo : Array<string> = someMagicFunction(YesNo); //["Yes", "No"]

¿Hay alguna manera de lograr esto?

Respuesta #1

La enumeración puede ayudarte aquí:

enum YesNo {
    YES,
    NO
}

interface EnumObject {
    [enumValue: number]: string;
}

function getEnumValues(e: EnumObject): string[] {
    return Object.keys(e).map((i) => e[i]);
}

getEnumValues(YesNo); // ['YES', 'NO']

La declaración type no crea ningún símbolo que puedas usar en tiempo de ejecución, solo crea un alias en el sistema de tipos. Así que no hay manera de que puedas usarlo como argumento de función.

Si necesitas tener valores de cadena para el tipo YesNo, puedes usar un truco (ya que los valores de cadena de los enums aún no son parte de TS):

const YesNoEnum = {
   Yes: 'Yes',
   No: 'No'
};

function thatAcceptsYesNoValue(vale: keyof typeof YesNoEnum): void {}

Luego puedes usar getEnumValues(YesNoEnum) para obtener los valores posibles de YesNoEnum, es decir, ['Sí', 'No']. Es un poco feo, pero funcionaría.

Para ser honesto, yo habría optado solo por una variable estática así:

type YesNo = 'yes' | 'no';
const YES_NO_VALUES: YesNo[] = ['yes', 'no'];

Respuesta #2

Typescript 2.4 finalmente ha sido lanzado. Con el soporte de enumeraciones de cadenas ya no tengo que usar literales de cadenas y porque las enumeraciones de typescript se compilan a javascript puedo acceder a ellas en tiempo de ejecución (el mismo enfoque que para las enumeraciones de números).

Artículos relacionados