Búsqueda de sitios web

reactjs - Usar localStorage.getItem() con TypeScript


Tengo la siguiente línea de código:

const allGarments = teeMeasuresAverages || JSON.parse(localStorage.getItem("teeMeasuresAverages")) || teeMeasuresAveragesLocal;

Typescript lanza esta advertencia:

Argument of type 'string | null' is not assignable to parameter of type 'string'.
  Type 'null' is not assignable to type 'string'.

Entonces intenté incluir el operador de afirmación de no nulo (!):

const allGarments = teeMeasuresAverages || JSON.parse(localStorage.getItem("teeMeasuresAverages")) || teeMeasuresAveragesLocal;

Lo cual luego me da una advertencia diferente:

Forbidden non-null assertion.

Soy nuevo en TypeScript. ¿Qué está buscando aquí?

Respuesta #1

El tipo de dependencia de JSON.parse debe ser un string.

Pero el tipo de retorno de local storage es string|null, así que puede ser tanto string como null y cuando declaras los datos, su valor es null hasta que renderizas el componente (o llamas a la función) y luego llamas a la función getItem, obtiene el valor, y entonces es un string.

Puedes usar el operador || y agregarle una cadena para que ya no sea nulo.

JSON.parse(localStorage.getItem("teeMeasuresAverages") || '""') 

También puedes añadir // @ts-ignore para evitar que TypeScript verifique los tipos en la siguiente línea, pero no se recomienda

// @ts-ignore
JSON.parse(localStorage.getItem("teeMeasuresAverages"))//just the usual way 

Respuesta #2

JSON.parse espera string como primer argumento

JSON.parse(text: string, reviver?: ((this: any, key: string, value: any) => any) | undefined): any

Cuando localStorage devuelve string | null.

const value = localStorage.getItem("teeMeasuresAverages") // string | null

Si quieres hacer feliz a TS, solo verifica si value es una cadena

const value = localStorage.getItem("teeMeasuresAverages")

if (typeof value === 'string') {
    const parse = JSON.parse(value) // ok

}

Artículos relacionados