React hooks(useState等)如何做流式注解?
How to do flow type annotations for React hooks (useState, etc.)?
我们应该如何将 Flow 类型注释与 React 挂钩一起使用,例如 useState
?我试过搜索一些关于如何实施它们的例子,但找不到任何东西。
我试过这个:
const [allResultsVisible, setAllResultsVisible]: [ boolean, (boolean) => void, ] = useState(false);
这不会引发任何与流程相关的错误,但我不确定这是正确的还是注释挂钩的最佳方式。如果我的尝试不正确或不是最好的方法,我应该怎么做?
Flow 推断类型,因为 shown in the PR 添加了对 Flow 库的挂钩支持。
更新
正如我在另一个答案的评论中所讨论的,结果变量必须根据上下文使用,类型检查才能按预期工作。
const [loading, setLoading] = React.useState(true);
(loading: boolean);
setLoading('foo') // Flow error
对比
const [loading, setLoading] = React.useState(true);
setLoading('foo') // no Flow error
类型推断对我不起作用:
const [loading, setLoading] = React.useState(true) // boolean
setLoading('foo') // no Flow error
setLoading(1) // no Flow error
必须手动添加类型:
const [loading, setLoading]: [boolean, ((boolean => boolean) | boolean) => void] = React.useState(false)
setLoading('foo') // Flow error
setLoading(1) // Flow error
我有:
"react": "16.8.6",
"flow-bin": "0.100.0",
更新
正如@AndrewSouthpaw 指出的那样,loading
必须在某些上下文中使用,否则 setLoading
将无法正常工作。
这个有效:
const [loading, setLoading] = React.useState(true);
(loading: boolean);
setLoading('foo'); // Flow error
同样没有分号:
const [loading, setLoading] = React.useState(true)
;(loading: boolean)
setLoading('foo') // Flow error
ESLint
ESLint no-unused-expressions will give an error from this. eslint-plugin-flowtype has fixed version flowtype/no-unused-expressions.
如果可以从初始值推断类型,则无需为Flow添加类型信息,例如:
const [open, setOpen] = React.useState(false);
如果因为初始值是一个复杂的对象而无法推断,使用泛型来赋值一个类型,例如:
type Merchandize = {|
name: string,
value: number,
|};
const [shoppingCare, setShoppingCart] = React.useState<Array<Merchandize>>([]);
除了上面的答案,
确保将 // @flow
放在文件的最顶部,以使所有流程功能正常工作。
没有将 // @flow
放在顶部的唯一对我有用的解决方案是:
const [allResultsVisible, setAllResultsVisible]: [ boolean, Function ] = useState(false);
我们应该如何将 Flow 类型注释与 React 挂钩一起使用,例如 useState
?我试过搜索一些关于如何实施它们的例子,但找不到任何东西。
我试过这个:
const [allResultsVisible, setAllResultsVisible]: [ boolean, (boolean) => void, ] = useState(false);
这不会引发任何与流程相关的错误,但我不确定这是正确的还是注释挂钩的最佳方式。如果我的尝试不正确或不是最好的方法,我应该怎么做?
Flow 推断类型,因为 shown in the PR 添加了对 Flow 库的挂钩支持。
更新
正如我在另一个答案的评论中所讨论的,结果变量必须根据上下文使用,类型检查才能按预期工作。
const [loading, setLoading] = React.useState(true);
(loading: boolean);
setLoading('foo') // Flow error
对比
const [loading, setLoading] = React.useState(true);
setLoading('foo') // no Flow error
类型推断对我不起作用:
const [loading, setLoading] = React.useState(true) // boolean
setLoading('foo') // no Flow error
setLoading(1) // no Flow error
必须手动添加类型:
const [loading, setLoading]: [boolean, ((boolean => boolean) | boolean) => void] = React.useState(false)
setLoading('foo') // Flow error
setLoading(1) // Flow error
我有:
"react": "16.8.6",
"flow-bin": "0.100.0",
更新
正如@AndrewSouthpaw 指出的那样,loading
必须在某些上下文中使用,否则 setLoading
将无法正常工作。
这个有效:
const [loading, setLoading] = React.useState(true);
(loading: boolean);
setLoading('foo'); // Flow error
同样没有分号:
const [loading, setLoading] = React.useState(true)
;(loading: boolean)
setLoading('foo') // Flow error
ESLint
ESLint no-unused-expressions will give an error from this. eslint-plugin-flowtype has fixed version flowtype/no-unused-expressions.
如果可以从初始值推断类型,则无需为Flow添加类型信息,例如:
const [open, setOpen] = React.useState(false);
如果因为初始值是一个复杂的对象而无法推断,使用泛型来赋值一个类型,例如:
type Merchandize = {|
name: string,
value: number,
|};
const [shoppingCare, setShoppingCart] = React.useState<Array<Merchandize>>([]);
除了上面的答案,
确保将 // @flow
放在文件的最顶部,以使所有流程功能正常工作。
没有将 // @flow
放在顶部的唯一对我有用的解决方案是:
const [allResultsVisible, setAllResultsVisible]: [ boolean, Function ] = useState(false);