【发布时间】:2021-02-12 15:30:50
【问题描述】:
我正在尝试将 Context API 与 Typescript 一起使用,但没有任何工作正常,我很困惑,我已经在互联网上查阅了很多文章,但仍然无法让我理解这件事。
import { createContext, useState } from 'react';
export const SelectedContext = createContext<number>();
export const SelectedContextProvider = (props) => {
const [selectedId, setId] = useState(null);
const changeValue = (value:number | null) => {
setId(value);
}
return (
<SelectedContext.Provider value={{selectedId, changeValue}}>
{props.children}
</SelectedContext.Provider>
)
}
这就是我制作上下文的方式。我希望它具有 id: null 作为默认值,但是当用户在 Select 我要设置的选项中选择一个选项时,它是数字并进行 API 调用。但是现在我必须为上下文指定默认值,如果我这样做了,那么 typescript 会显示一个错误,而不是 type null 不能分配给我希望它在 handleChange 函数中的数字。
我的第二个问题是,如果我的 props 是 react 子级,我该怎么说我的 props 将是什么类型,所以它可以是一个 React 节点数组的空数组,我不喜欢指定它因为在这种情况下使用打字稿没有用处。
<SearchContextProvider>
<CitySearchBar/>
<CitySelect/>
</SearchContextProvider>
会有这样的人为我解释一切吗?我是打字稿的新手,我不知道如何修复 anmything :(
所以我确实喜欢 vuongvu 的建议,现在我得到了
Type '{ selectedId: number | null; changeValue: (value: number | null) =>
void; }' is not assignable to type 'null'.ts(2322)
index.d.ts(335, 9): The expected type comes from property 'value' which is
declared here on type 'IntrinsicAttributes & ProviderProps<null>'
上下文提供者的值属性
因此,在进行重大更改后,我只收到一个错误,但它仍然出现。似乎现在我的提供者只期望 setter 作为一个值,而不是 data 和 setter,我收到这样的错误:
Type '[MySelectedContextType,
Dispatch<SetStateAction<MySelectedContextType>>]' is not assignable to type
'Dispatch<SetStateAction<MySelectedContextType>>'.
Type '[MySelectedContextType,
Dispatch<SetStateAction<MySelectedContextType>>]' provides no match for the
signature '(value: SetStateAction<MySelectedContextType>): void'.ts(2322)
所以我遇到的另一个问题是,当我尝试使用这个上下文时,我得到了这个错误:
TypeError: Object is not iterable (cannot read property
Symbol(Symbol.iterator))
就像你说的那样,我明白了:
const [selectedId, setSelectedId] = useSelectedContext();
【问题讨论】:
标签: reactjs typescript