cbd*_*per 15 typescript reactjs typescript-typings react-hooks use-state
我正在将我的 React 项目转换为 Typescript。
我有这样的状态:
AdminBlogPostContainer.tsx
const [blogPost,setBlogPost] = useState<null | BLOGPOST>(null);
return(
<AdminBlogPostPage
blogPost={blogPost as BLOGPOST}
setBlogPost={setBlogPost}
/>
);
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
这是错误消息:
Pat*_*rts 22
让我们从一些相关的类型定义开始@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>>];
// ...
}
Run Code Online (Sandbox Code Playgroud)
setBlogPost
由此我们已经可以推断出语句中的类型
const [blogPost, setBlogPost] = useState<null | BLOGPOST>(null);
Run Code Online (Sandbox Code Playgroud)
这是Dispatch<SetStateAction<null | BLOGPOST>>
,但让我们分解一下,看看每个部分的含义。
setBlogPost: (value: null | BLOGPOST | ((prevState: null | BLOGPOST) => null | BLOGPOST)) => void;
Run Code Online (Sandbox Code Playgroud)
从外到内一次消化这一块,我们得到以下解释:
setBlogPost: (value: ...) => void
setBlogPost
是一个接受参数value
并返回 的函数void
。
value: null | BLOGPOST | ((prevState: ...) => null | BLOGPOST)
value
是null
、 aBLOGPOST
或接受参数prevState
并返回null
or a 的函数BLOGPOST
。
prevState: null | BLOGPOST
prevState
是null
或BLOGPOST
。