tslint - TypeScript TS7053: El elemento tiene implícitamente un tipo 'any' porque una expresión de tipo 'string' no se puede usar para indexar el tipo '{}'
Tengo este código:
const expressionAttributeValues = {};
expressionAttributeValues[`:${status}`] = status; // TSLinst error
// status is a string
y obtuve ese error de TSlint:
TS7053: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{}'. No index signature with a parameter of type 'string' was found on type '{}'.
¿Qué está mal en esa línea?
Respuesta #1
Al definir const expressionAttributeValues={}, no se especifica un tipo explícito, por lo que el compilador asume implícitamente que el valor que asignas es el tipo. En este caso, asignas {}, es decir, un objeto vacío. Es como si lo tiparas así: const expressionAttributeValues: {}={}.
Ahora un objeto vacío que no tiene propiedades no tiene claves, por definición.
A continuación, intentas acceder a la propiedad del objeto :$ {status}. Como el compilador ahora cree que expressionAttributeValues puede solo ser un objeto sin ninguna propiedad, se queja.
La solución primitiva y no tan elegante sería simplemente escribir expressionAttributeValues como any: const expressionAttributeValues: any={}. Esto detendrá la advertencia del compilador, ya que ahora expressionAttributeValues literalmente puede ser cualquier cosa y, por lo tanto, tener cualquier propiedad.
El enfoque más elegante sería, si es posible, tipar de manera más explícita expressionAttributeValues y :$ {status}.
Por ejemplo:
interface MyType {
a?: string;
b?: string;
c?: string;
}
const expressionAttributeValues: MyType = {};
const property: keyof MyType = 'a';
console.log(expressionAttributeValues[property]);
Una definición mínima ("todas las claves son válidas y los valores de sus propiedades son todos cadenas") también podría ser:
type MyType {
[key: string]: string;
}
Respuesta #2
Necesitas indicar al compilador que el tipo de expressionAttributeValues es un mapeo de clave-valor de un string a un string, es decir.
const expressionAttributeValues: { [key: string]: string } = {};
