我收到错误:
Property 'ip' does not exist on type 'IpDetails | Error'.
Property 'ip' does not exist on type 'Error'.ts(2339)
即使我通过("message" in res)
或用于isError
缩小类型来检查类型。是我做错了什么还是 TypeScript 的 bug?
interface IpDetails {
ip : string,
}
interface Error {
error: {
code : number,
message: string,
},
}
let collection: IpDetails[] = [];
function isError(res: any | Error): res is Error {
return (res as Error).error !== undefined;
}
const getIpData = async (ipAddress: string, config: any = {}): Promise<IpDetails|Error> => {
return new Promise((resolve, reject) => {
resolve({ip : '1.1.1.1'});
});
}
(async () => {
let res = await getIpData('1.1.1.1');
if (!isError(res)) { // if ('error' in res)
let dublicate = collection.find(entry => entry.ip === res.ip); // <--- ERROR
}
})();
当回调函数中有代码时,打字稿不知道何时调用该函数。你我都知道
.find
回调是同步调用的,但类型信息无法表明这一点。因此,TypeScript 必须假设最坏的情况:该代码可能在将来的某个任意时刻被调用(就像 setTimeout 发生的情况一样)。这意味着您刚刚执行的检查isError
可能不再准确,因为某些代码可能res
同时重新分配。解决这个问题最简单的方法是创建
res
一个 const。这样,TypeScript 就可以确保,如果检查在某一点上是准确的,那么它将始终是准确的。