Digamos que tengo:

const generate = (array: string[]) => {
   const obj: any = {};
   array.map(a => a.toUpperCase()].forEach(a => obj[a] = a);

   return obj;
}

Para que yo pueda hacer:

const constants = generate(['foo', 'bar']);
constants.FOO;
constants.BAR;

¿Hay alguna forma de definir el tipo para que constants.BAZ, por ejemplo, elimine errores?

1
Kousha 17 ene. 2018 a las 22:41

3 respuestas

La mejor respuesta

Actualmente no hay una manera de realizar operaciones de transformación de cadenas como toUpperCase / toLowerCase en el sistema de tipos TypeScript

3
Ryan Cavanaugh 17 ene. 2018 a las 19:43

La respuesta de Ryans es excelente y si puedo ampliarla ya que no puedes convertirla en una constante, pero puedes hacer esto:

function generate<K extends string>(...keys: K[]): { [P in K]: P; } {
    const obj: any = {};
    keys.forEach(k => obj[k] = k;
    return obj;
}

const constants = generate("foo", "bar");
constants.foo;
constants.bar;
constants.baz; // fails because key is not in K
constants.foo = "fo"; // fails because value is not same as key.
0
JGoodgive 18 ene. 2018 a las 00:01

¿Y si nos olvidamos de la transformación del texto? Si proporciono ['foo', 'bar'] quiero obtener constant.foo y constant.bar

Sí, esto se puede lograr utilizando argumentos de tipo y tipos de mapa:

function generate<K extends string>(...keys: K[]): { [P in K]: string; } {
    const obj: any = {};
    keys.forEach(k => obj[k] = k);
    return obj;
}

const constants = generate("foo", "bar");
constants.foo; // string
constants.bar; // string
constants.baz; // Error

(Utilicé un argumento de reposo sin ningún motivo en particular, podría convertirlo en un argumento de matriz única del mismo tipo K[]).

0
Aaron Beall 18 ene. 2018 a las 00:26