当前位置: 首页 > 知识库问答 >
问题:

使用TypeScript在useState React钩子上设置类型

张权
2023-03-14

我正在迁移React with TypeScript项目以使用钩子特性(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上强制执行类型检查,特别是如果它依赖于一些道具的话。

谢谢你的帮助。


共有3个答案

方长卿
2023-03-14

您还可以在之前声明初始状态,然后可以随时调用它:

type User = typeof initUser;
const initUser = {name: 'Jon'}
...
const [user, setUser] = useState<User>(initUser);

关于I接口前缀:https://basarat.gitbooks.io/typescript/content/docs/styleguide/styleguide.html#interface

郤玉书
2023-03-14

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

看看这个答案。

燕昊东
2023-03-14

用这个

const [user, setUser] = useState<IUser>({name: 'Jon'});

请参阅相应的类型在明确类型

 类似资料:
  • 问题内容: 我正在迁移带有TypeScript的React项目以使用钩子功能(React v16.7.0-alpha),但是我不知道如何设置已分解元素的类型。 这是一个例子: 我想强制变量为type 。我唯一成功的试用是分两个阶段进行的:键入,然后初始化: 但是我敢肯定有更好的方法。另外,应将其初始化为以a 作为输入但不返回任何内容的函数。 另外,值得注意的是,不进行任何初始化就可以正常使用,但是

  • 问题内容: 我不敢相信我以前没有做过,但是我想得到一个明确的答案,所以我已经准备好了。 我有一个Apache的配置文件,看起来像这样: 因此,这可以很好地处理html和php文件。但是我在那里有多个项目,因此想开始使用子域。我想要做的是将文件从用作根目录。 我尝试将以下内容添加到我的apache文件的底部: 但apache抱怨: 我知道我犯了一个基本错误,但是我不确定这是什么。 编辑 现在是我完整

  • 提前谢了。我有一个状态数组,如下所示。 我需要添加一个项目到状态数组,我发现我们不需要做状态突变。如何使用PrevState设置状态。 如何调用set State以追加此状态数组。 像这样的东西?

  • 我想用React useState钩子设置多个状态值,这样我就可以用useEffect钩子分别更新它们。我有以下代码: 但是当我用React DevTools检查应用程序时,我会看到钩子的多个“状态”值,而不是“订单”、“支付”、“提交”等。

  • 我对react、react hooks和js/ts非常陌生。 目前,我正在编码一个简单的按钮,它通过useContext获取一个状态,并通过useReucer和调度函数更新该状态。 我试图将我所有的代码分离到特定的文件中。来自减速器的调度函数在提供程序中作为值传递。 当我在使用者组件中调用传递的函数时,我可以给它一个任何类型的值(在我的示例中是数字)给调度器。我在上下文、reducer等中设置了所

  • 假设我有一个依赖于其他状态的状态(例如,当A改变时,我希望B改变)。 在useEffect钩子中创建一个观察a并设置B的钩子是否合适? 效果是否会层叠,当我单击按钮时,第一个效果会激发,导致b发生变化,导致第二个效果激发,然后再进行下一次渲染?这样构造代码有没有性能方面的缺点?