对Typescript相当陌生,想知道是否有一种方法可以避免在使用Context中的值时重新声明类型。
下面举个简化的例子来说明我的意思:
在上下文文件中:
const [name, setName] = useState("");
const updateName = (name: string) => {
setName(name);
};
return (
<TasksContext.Provider
value={{
name,
updateName
}}>
{children}
</TasksContext.Provider>
);
};
字符串
然后在使用该上下文的组件中:
const {
updateName
} = useContext(TasksContext);
<Switch
onValueChange={() => {
updateName(57); //doesn't error as updateName is any
}}
/>
型
我知道我可以通过在使用上下文的组件中执行以下操作来再次提供类型安全:
const {
updateName
} = useContext<updateName: (string) => {}>(TasksContext);
型
但这似乎有点矫枉过正,因为Typescript不应该能够推断出它的函数需要一个来自Context提供程序的字符串参数吗?如果我在Context文件中向函数添加另一个参数,那么我就必须在整个应用程序中找到调用它的位置,并再次编辑类型。
谢谢
2条答案
按热度按时间v8wbuo2f1#
可以在创建上下文时提供类型参数:
字符串
如果在
TasksContext.Provider
之外使用useContext(TasksContext)
,则会将value
属性输入为TasksContextType
或null
。这可能会使对useContext()
的调用有点多余:型
一种常见的方法是将
useContext()
调用放入自己的钩子中,通过抛出错误来处理null
,允许您的自定义钩子返回TasksContextType
类型:型
在你的组件中,你可以这样使用它:
型
9ceoxa922#
缺少
name
和updateName
的类型定义的问题是-就像你在评论中提到的-在创建上下文时没有定义类型。在你当前的实现中,你创建了一个没有任何类型或默认值的上下文,所以typescript不知道你的上下文是什么样子的。
字符串
如果您想在
useContext(TaskContext)
中使用TaskContext
时获得正确的类型,则必须为隐式类型提供默认值,或者显式使用类型定义来定义上下文。解决这个问题的首选方法是在创建上下文时提供默认值。使用这种方法,当您使用
TaskContext
时,您将获得类型定义,并且您不必处理TaskContext
在某些情况下可能为null或其他的问题。型
感谢@Nick Parsons,这里有一个使用显式类型创建上下文的好例子。