Estoy migrando un proyecto de React con TypeScript para usar funciones de hooks (React v16.7.0-alpha), pero no puedo averiguar cómo configurar los tipos de los elementos desestructurados.
Aquí hay un ejemplo:
interface IUser {
name: string;
}
...
const [user, setUser] = useState({name: 'Jon'});
Quiero forzar que la user
variable sea de tipo IUser
. Mi única prueba exitosa es hacerlo en dos fases: escribiendo, luego inicializando:
let user: IUser;
let setUser: any;
[user, setUser] = useState({name: 'Jon'});
Pero estoy seguro de que hay una forma mejor. Además, setUser
debe inicializarse como una función que toma IUser
como entrada y no devuelve nada.
Además, vale la pena señalar que usar const [user, setUser] = useState({name: 'Jon'});
sin ninguna inicialización funciona bien, pero me gustaría aprovechar TypeScript para forzar la verificación de tipos en init, especialmente si depende de algunos accesorios.
Gracias por tu ayuda.
fuente
IUser
, es decir, que tenga las mismas propiedades. Se llama tipeo de pato.type MyType = MyObj[];
entoncesuseState<MyType>
useState
devuelve una tupla bien escrita, que está asignada[user, setUser]
y no es difícil para TypeScript entender que las variables deben ser del mismo tipo que los constituyentes de la tupla. No sé si aclaré las cosas o te confundí más.Primero
useState
toma un genérico, que será tu IUser. Si luego desea pasar el segundo elemento desestructurado que devuelveuseState
, deberá importar Dispatch. Considere esta versión extendida de su ejemplo que tiene un controlador de clics:import React, { useState, Dispatch } from 'react'; interface IUser { name: string; } export const yourComponent = (setUser: Dispatch<IUser>) => { const [user, setUser] = useState<IUser>({name: 'Jon'}); const clickHander = (stateSetter: Dispatch<IUser>) => { stateSetter({name : 'Jane'}); } return ( <div> <button onClick={() => { clickHander(setUser) }}>Change Name</button> </div> ) }
Vea esta respuesta .
fuente
También puede declarar el estado inicial antes y luego poder llamarlo en cualquier momento que desee:
type User = typeof initUser; const initUser = {name: 'Jon'} ... const [user, setUser] = useState<User>(initUser);
Acerca de los prefijos de la interfaz I: https://basarat.gitbooks.io/typescript/content/docs/styleguide/styleguide.html#interface
fuente
https://fettblog.eu/typescript-react/hooks/
// import useState next to FunctionComponent import React, { FunctionComponent, useState } from 'react'; // our components props accept a number for the initial value const Counter:FunctionComponent<{ initial?: number }> = ({ initial = 0 }) => { // since we pass a number here, clicks is going to be a number. // setClicks is a function that accepts either a number or a function returning // a number const [clicks, setClicks] = useState(initial); return <> <p>Clicks: {clicks}</p> <button onClick={() => setClicks(clicks+1)}>+</button> <button onClick={() => setClicks(clicks-1)}>-</button> </> }
fuente