Javascript 获取类型脚本错误:键入';任何[]和#x27;不可分配给类型';从不[]';。TS2345

Javascript 获取类型脚本错误:键入';任何[]和#x27;不可分配给类型';从不[]';。TS2345,javascript,reactjs,typescript,Javascript,Reactjs,Typescript,我不知道为什么会出现这个错误类型“any[]”不能分配给类型“never[]”。TS2345这是我的代码。它在抱怨合并的数组 const [allInfo, setAllInfo] = useState([]); useEffect(() => { async function fetchData() { const validatorResponse = await axios.get(validatorEndpoint); const vali

我不知道为什么会出现这个错误<代码>类型“any[]”不能分配给类型“never[]”。TS2345这是我的代码。它在抱怨合并的数组

  const [allInfo, setAllInfo] = useState([]);

  useEffect(() => {
    async function fetchData() {
      const validatorResponse = await axios.get(validatorEndpoint);
      const validatorIps = [];
      for (let i = 0; i < validatorResponse.data.count; i += 1) {
        const ipAddress = validatorResponse.data.results[i].ip_address;
        validatorIps.push({query: ipAddress});
      }
      const resultBatch = await axios.post(ipInfoEndpoint, validatorIps);
      const merged = [];
      for (let i = 0; i < validatorResponse.data.results.length; i += 1) {
        merged.push({
          ...validatorResponse.data.results[i],
          ...resultBatch.data[i],
        });
      }
      console.log(merged);
      setAllInfo(merged);
    }
    fetchData();
  }, []);
我试过了

const result : string[] = [];
以及常数

[allInfo, setAllInfo] = useState([] as any);

您可以通过为
merged
提供比推断类型更好的类型(
never[]
)来修复此错误

const-merged:any[]=[]应该足够了,但我建议您考虑更好的类型。

您还可以使用
Array.prototype.map
方法帮助typescript推断类型,当您希望使用从原始数组转换的每个元素创建新数组时,通常最好使用
.map

const merged=validatorResponse.data.results.map((result,i)=>({
…结果,
…结果批次数据[i],
})

使用默认值这可以防止将来的类型错误,尝试使用实类型,而不是任何类似类型

const [allInfo, setAllInfo] = useState<Array<typed>>([]);

const fetchData = async (): Promise<void> => {
  const { 
    data: {
     results = []
    } = {} 
  } = await axios.get(validatorEndpoint);
  const validatorIps = results.map(({ ip_address}) => ({query: id_address}));

  const { data = []}= await axios.post(ipInfoEndpoint, validatorIps);
  const merged = results.map((result, i) => ({
    ...result,
    ...data[i]
  });
 setAllInfo(merged)
}

useEffect(() => {
  fetchData();
}, []);
const[allInfo,setAllInfo]=useState([]);
const fetchData=async():Promise=>{
常数{
数据:{
结果=[]
} = {} 
}=等待axios.get(验证端点);
const validatorIps=results.map({ip_address})=>({query:id_address}));
const{data=[]}=wait axios.post(ipinfo端点,validatorIps);
const merged=results.map((result,i)=>({
…结果,
…数据[i]
});
setAllInfo(合并)
}
useffect(()=>{
fetchData();
}, []);

`

在使用Typescript和React时,为您的状态提供一个严格键入的接口,这是一种常见的模式,否则Typescript编译器将对其进行推断。对于许多其他类型,推断将起作用,但对于数组,大多数情况下不会起作用,因为对于空数组,最安全的假设类型是
从不[]

所有这些都表明,当您创建分配给变量的数组时,最好严格使用接口或自定义类型键入该数组

因此,您的代码通常看起来更像这样:

interface Foo {
  ...
}
...

const [allInfo, setAllInfo] = useState<Foo[]>([]);

const fetchData = async (): Promise<void> => {
  const { 
    data: {
     results = []
    } = {} 
  } = await axios.get(validatorEndpoint);
  const validatorIps = results.map(({ ip_address }) => ({query: id_address}));
  const { data = [] } = await axios.post(ipInfoEndpoint, validatorIps);

  const merged = results.map((result, i) => ({
    ...result,
    ...data[i]
  });

 setAllInfo(merged)
}

useEffect(() => {
  fetchData();
}, []);
接口Foo{
...
}
...
常量[allInfo,setAllInfo]=useState([]);
const fetchData=async():Promise=>{
常数{
数据:{
结果=[]
} = {} 
}=等待axios.get(验证端点);
const validatorIps=results.map({ip_address})=>({query:id_address}));
const{data=[]}=wait axios.post(ipinfo端点,validatorIps);
const merged=results.map((result,i)=>({
…结果,
…数据[i]
});
setAllInfo(合并)
}
useffect(()=>{
fetchData();
}, []);
我是用我所掌握的信息键入的,但是将来您还应该在
fetchData
中为您的API响应提供类型,否则依赖推断会遇到更多类型问题


最后一件事,
fetchData
useffect
中违反了
详尽的deps
linter规则React。在这种情况下,它没有太大的问题,但是
fetchData
应该在
useffect
中定义,或者使用
useCallback
钩子来定义。

你试过
const吗[allInfo,setAllInfo]=useState([]);
?@JayKariesch刚刚尝试过,并且得到类型“any”不可分配给类型“never”你说它在抱怨合并数组,你的意思是当你试图将合并数组设置为状态时,还是另一行代码?@CoryHarper是的,当我尝试设置allInfo(合并)时;这是返回错误的行,
validatorResponse.data.results[i]
resultBatch.data[i]
的类型是什么?如果其中任何一个是
never
,则结果表达式强制
合并
never[]
interface Foo {
  ...
}
...

const [allInfo, setAllInfo] = useState<Foo[]>([]);

const fetchData = async (): Promise<void> => {
  const { 
    data: {
     results = []
    } = {} 
  } = await axios.get(validatorEndpoint);
  const validatorIps = results.map(({ ip_address }) => ({query: id_address}));
  const { data = [] } = await axios.post(ipInfoEndpoint, validatorIps);

  const merged = results.map((result, i) => ({
    ...result,
    ...data[i]
  });

 setAllInfo(merged)
}

useEffect(() => {
  fetchData();
}, []);