Установите типы на useState React Hook с TypeScript

Я переношу проект React с проектом TypeScript, чтобы использовать функции hooks (React v16.7.0-alpha), но я не могу понять, как установить типизацию деструктурированных элементов.

Вот пример:

interface IUser {
  name: string;
}
...
const [user, setUser] = useState({name: 'Jon'});

Я хочу заставить переменную user иметь тип IUser. Мое единственное успешное судебное разбирательство делает это в два этапа: ввод, затем инициализация:

let user: IUser;
let setUser: any;
[user, setUser] = useState({name: 'Jon'});

Но я уверен, что есть лучший способ. Кроме того, setUser должен быть инициализирован как функция, которая принимает IUser как входную, и ничего не возвращает.

Кроме того, стоит отметить, что использование const [user, setUser] = useState({name: 'Jon'}); без каких-либо операций инициализации, но я хотел бы использовать TypeScript для принудительной проверки типа init, особенно если это зависит от некоторых реквизитов.

Спасибо за вашу помощь.

Ответ 2

Сначала useState берет универсальный, который будет вашим IUser. Если затем вы хотите передать второй деструктурированный элемент, возвращаемый useState, вам нужно будет импортировать Dispatch. Рассмотрим расширенную версию вашего примера с обработчиком кликов:

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>
    ) 
}

Смотрите этот ответ.