Búsqueda de sitios web

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.