我有一个返回类型为typeXYZ || unknown的customizedHook。我想要解构返回值,但我有错误字符串,甚至数据返回为xyz:{},abc返回‘TS2339: Property 'xyz' does not exist on type 'unknown'. 1’,'string2‘,我该如何解决它?
export function useAPICall(): typeXYZ || unknown {
const {data} = useQuery(['apiCallData'], async () => {
const value: typeABC = (await cbFunction()) as typeABC;
return value?.defaultValue;
});
return {data};
//console.log(data)
//{xyz: {abc: 'asdasda', cde: 'xzczxc'}, abc: ['aaaa','bbbb','cccc']}
}
const {xyz: {}, abc: string[]} = useAPICall()发布于 2021-08-03 03:35:50
当您使用像TypeXYZ | unknown这样的联合类型(它是一个单独的管道)时,类型限制比联合中的任何单个类型都严格,这与您可能想象的相反。
例如,如果你有这样的代码:
const a = get_value() as number | string;
const b = parseInt(a, 10);你会得到一个类型错误,因为parseInt不允许数字类型的参数。换句话说,使用联合编写的任何代码都必须对联合中的所有类型有效。因为unknown是所有类型中限制性最强的(您通常必须将其强制转换为某种类型才能使用它),所以它实际上完全覆盖了XYZ。
但是,如果您使用的是限制最少的any类型,那么使用TypeXYZ就没有任何意义了,因为any允许您对对象执行任何操作。
如果您正在解构xyz,那么您必须(或者应该!)在执行此操作之前,请确保对象的类型为TypeXYZ,在这种情况下,可以使用as TypeXYZ对其进行强制转换。
记住,Typescript对你的运行时类型一无所知,如果你的API返回了一些意想不到的东西,那是Typescript无法帮助你的情况。因此,如果您的API返回的数据可能采用多种形式,则需要执行一些运行时类型检查,例如:
const res = useApiCall();
if (res.xyz) {
const { xyz } = res as TypeXYZ;
}https://stackoverflow.com/questions/68629863
复制相似问题