Javascript Typescript:Type';X';没有为签名提供匹配项';(prevState:未定义):未定义';
所以我有一个使用TypeScript的React本机应用程序,有一个让我抓狂的错误 基本上,有一个可搜索的列表。它由一个值数组启动。一旦用户在搜索栏中键入,启动的数组将被过滤,并返回一个更新的数组 但是,TypeScript给了我一个错误:Javascript Typescript:Type';X';没有为签名提供匹配项';(prevState:未定义):未定义';,javascript,reactjs,typescript,react-native,Javascript,Reactjs,Typescript,React Native,所以我有一个使用TypeScript的React本机应用程序,有一个让我抓狂的错误 基本上,有一个可搜索的列表。它由一个值数组启动。一旦用户在搜索栏中键入,启动的数组将被过滤,并返回一个更新的数组 但是,TypeScript给了我一个错误:类型“{id:string;name:string;selected:boolean;}[]”没有为签名(prevState:undefined):undefined)提供匹配项。 我很困惑,因为我不知道这个'(prevState:undefined):und
类型“{id:string;name:string;selected:boolean;}[]”没有为签名(prevState:undefined):undefined)提供匹配项。
我很困惑,因为我不知道这个'(prevState:undefined):undefined'
实际上来自何处以及为什么。你知道我做错了什么吗?非常感谢您的帮助
代码如下:
const defaultChoices = [
{
id: '1',
name: 'default',
selected: false,
},
];
let choicesList;
const getChoicesList = () => {
if (listName === 'include') {
choicesList = Object.values(includeChoices).map(choice => ({
...choice,
}));
} else if (listName === 'exclude') {
choicesList = Object.values(excludeChoices).map(choice => ({
...choice,
}));
}
};
const [filteredChoicesList, setFilteredChoicesList] = useState(choicesList);
useEffect(() => {
getChoicesList();
}, []);
useEffect(() => {
let choices = defaultChoices;
if (listName === 'include') {
choices = includeChoices;
} else if (listName === 'exclude') {
choices = excludeChoices;
} else {
choices = defaultChoices;
}
const newChoices = choices.filter(item => {
const itemData = `${item.name.toUpperCase()}`; // ignore Uppercase/Lowercase and make equal
const textData = query.toUpperCase();
return itemData.indexOf(textData) > -1;
});
setFilteredChoicesList(newChoices); // error occurs for "newChoices"
}, [effect]);
问题是,您已将
选项列表设置为未定义。并且在组件的第一次初始化时调用getChoicesList
,但在此之前,将在choicesList
未定义的位置设置状态us
将代码部分更新为
let choicesList: any[] = [];
const getChoicesList = () => {
let data: any[] = [];
if (listName === 'include') {
data = Object.values(includeChoices).map(choice => ({
...choice,
}));
} else if (listName === 'exclude') {
data = Object.values(excludeChoices).map(choice => ({
...choice,
}));
}
return data;
};
const [filteredChoicesList, setFilteredChoicesList] = useState<any[]>(choicesList);
useEffect(() => {
const updatedList = getChoicesList();
setFilteredChoicesList(updatedList)
}, []);
let choicesList:any[]=[];
常量getChoiceList=()=>{
let数据:任意[]=[];
如果(listName=='include'){
数据=对象.值(包括选项).map(选项=>({
…选择,
}));
}else if(listName==='exclude'){
数据=对象.值(不包括选项).map(选项=>({
…选择,
}));
}
返回数据;
};
常量[filteredChoicesList,setFilteredChoicesList]=useState(choicesList);
useffect(()=>{
const updatedList=getChoiceList();
setFilteredChoicesList(更新列表)
}, []);
现在,您将拥有包含所需数据的filteredChoicesList
,您不应该有任何编译错误。
另一件事是,创建一个接口,并在状态和定义时用该接口替换any
。不确定这是否会解决错误,但您可能应该将choicesList
(从而将状态数组)初始化为[]
。另外,不是Typescript专家,但在声明变量和参数时不应该声明类型吗?请给出一个例子,代码看起来非常复杂。例如,为什么在一行中使用`${item.name.toUpperCase()}`
,而在下一行中使用(更简单的)等效的query.toUpperCase()
?包含或排除项目的逻辑不也应该逆转比较吗?很高兴它起到了作用!