【问题标题】:Type for the setState function of the useState hook?useState 钩子的 setState 函数的类型?
【发布时间】:2020-12-17 08:28:38
【问题描述】:

我正在将我的 React 项目转换为 Typescript。

我有这样的状态:

AdminBlogPostContainer.tsx

const [blogPost,setBlogPost] = useState<null | BLOGPOST>(null);

return(
  <AdminBlogPostPage
    blogPost={blogPost as BLOGPOST}
    setBlogPost={setBlogPost}
  />
);

AdminBlogPostPage.tsx

interface AdminBlogPostPage {
  blogPost: BLOGPOST,
  setBlogPost:            // <---- WHAT SHOULD I USE AS TYPE HERE ?
}

const AdminBlogPostPage: React.FC<AdminBlogPostPage> = (props) => {
  console.log("Rendering AdminBlogPostPage...");

  return(
    // ...
  );
};

export default AdminBlogPostPage;

这是错误信息:

【问题讨论】:

  • 无论如何你都不应该改变孩子的父母状态
  • 感谢您的回复。但无论我是否应该从父级更改子级的状态,有没有人知道在这种情况下我应该为setState 函数使用什么类型?
  • 由于不接受答案,因此无法作为重复项关闭,否则应该是...stackoverflow.com/q/63551792
  • @PatrickRoberts 谢谢!!这就是我一直在寻找的。所以在我的情况下,我应该使用:React.Dispatch&lt;React.SetStateAction&lt;null | BLOGPOST&gt;&gt;?随时在这里回答,如果可行,我会接受您的回答。
  • 欣赏接受的答案,继续并从另一篇帖子中删除我的答案,并将其改为规范副本。

标签: reactjs typescript react-hooks typescript-typings use-state


【解决方案1】:

让我们从@types/react 的一些相关类型定义开始。

declare namespace React {
    // ...
    type SetStateAction<S> = S | ((prevState: S) => S);
    // ...
    type Dispatch<A> = (value: A) => void;
    // ...
    function useState<S>(initialState: S | (() => S)): [S, Dispatch<SetStateAction<S>>];
    // ...
}

由此我们已经可以推断出语句中setBlogPost的类型

const [blogPost, setBlogPost] = useState<null | BLOGPOST>(null);

这是Dispatch&lt;SetStateAction&lt;null | BLOGPOST&gt;&gt;,但让我们分解一下,看看每个部分的含义。

setBlogPost: (value: null | BLOGPOST | ((prevState: null | BLOGPOST) => null | BLOGPOST)) => void;

从外到内逐一消化,我们得到以下解释:

  • setBlogPost: (value: ...) =&gt; void

    setBlogPost是一个接受参数value并返回void的函数。

    • value: null | BLOGPOST | ((prevState: ...) =&gt; null | BLOGPOST)

      value 可以是nullBLOGPOST,或者是接受参数prevState 并返回nullBLOGPOST 的函数。

      • prevState: null | BLOGPOST

        prevStatenullBLOGPOST

【讨论】:

    【解决方案2】:
    interface AdminBlogPostPage {
      blogPost: BLOGPOST;
      setBlogPost: Function;            // <---- You may use the Function type here
    }
    

    【讨论】:

    • Typescript 出错并且不建议使用此 OOTB:不要使用 Function 作为类型。 Function 类型接受任何类似函数的值。它在调用函数时不提供类型安全,这可能是常见的错误来源。它还接受诸如类声明之类的东西,它们将在运行时抛出,因为它们不会被new 调用。如果您希望该函数接受某些参数,则应显式定义该函数
    猜你喜欢
    • 2019-10-17
    • 2021-05-26
    • 1970-01-01
    • 2020-06-24
    • 2020-02-11
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多