Javascript 获取类型脚本错误:键入';任何[]和#x27;不可分配给类型';从不[]';。TS2345
我不知道为什么会出现这个错误<代码>类型“any[]”不能分配给类型“never[]”。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
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();
}, []);