intellisense - Inferir nombres de claves con Typescript
El siguiente código funciona bien en Visual Studio Code:
type MyType = {
id: number;
name: string;
};
type MyTypes = { [name: string]: MyType };
const MY_TYPES:MyTypes = {
ONE: { id: 0, name: 'name0' },
TWO: { id: 1, name: 'name1' }
};
console.log(MY_TYPES.ONE); //Intellisense error
console.log(MY_TYPES['ONE']);
Ambas declaraciones de registro se compilan y producen lo mismo, pero la primera genera un error en VS Code y dice 'Property 'ONE' does not exist on type'. ¿Hay alguna otra forma de estructurar mi código para que VS Code pueda inferir/completar automáticamente que MY_TYPES tiene los nombres de propiedades ONE y TWO?
Respuesta #1
Si estás utilizando un objeto indexado, entonces solo puedes acceder a las propiedades usando un índice:
type MyTypes = { [name: string]: MyType };
console.log(MY_TYPES["ONE"]);
Eso se debe a que el compilador solo sabe que el objeto tiene claves de tipo string, no conoce las claves específicas.
Si quieres poder acceder a las propiedades usando la notación de puntos, entonces necesitas hacer esto:
type MyTypes = {
ONE: MyType;
TWO: MyType;
}
console.log(MY_TYPES.ONE);
Sin embargo, puedes simplemente hacer esto:
type MyTypes = {
ONE: MyType;
TWO: MyType;
}
const MY_TYPES = {
ONE: { id: 0, name: 'name0' },
TWO: { id: 1, name: 'name1' }
};
Y el compilador inferirá el tipo para MY_TYPES.
