Estoy escribiendo una prueba en la que estoy creando un objeto literal. Por ejemplo:
const myObject = { id: 1, name: 'egg', error: null } El valor inicializado de myObject.error es nulo. Sin embargo, cuando intento establecerlo en un nuevo valor más adelante. Por ejemplo:
myObject.error = ['exception', 'mapping'] Le asigno un nuevo valor de string[] pero aparece un error:
Type 'string[]' is not assignable to type 'null'.ts(2322)myObject no es una interfaz o un tipo, entonces, ¿por qué espera que siempre sea un valor nulo?
¡Gracias!
Eso sucede porque no definió específicamente ningún otro tipo para myObject const, lo que hará que TypeScript asigne la siguiente definición de tipo de forma predeterminada:
const myObject: { id: number; name: string; error: null; } Sí, null es un tipo TypeScript y, obviamente, string[] no es compatible con eso. Sin embargo, puede definir el tipo usted mismo y hacerlo compatible de la siguiente manera:
type ObjectType = { id: number; name: string; error: null | string[]; } const myObject: ObjectType = { id: 1, name: 'egg', error: null } myObject.error = ['exception', 'mapping'] De esta manera, le está informando a TypeScript que myObject.error puede asumir los valores de tipo null o string[] .
TypeScript infiere (adivina) el tipo de myObject , en su caso es:
{ id: number; name: string; error: null; } Cuando intenta asignar un error , falla porque espera null . Podrías crear una interfaz:
interface Produce { id: number; name: string; error: string[] | null; } const myObject: Produce = { id: 1, name: 'egg', error: null }; myObject.error = ['a']; // <== This works Con respecto al uso de null , ¿podría usar una opción T? en cambio, que es equivalente a T | undefined :
interface Produce { id: number; name: string; error?: string[]; } const myObject: Produce = { id: 1, name: 'egg' };