TypeScript中处理多返回类型:安全访问socket.address属性
解决方法
1. 使用类型守卫做安全检查
通过判断返回值的结构来确定它属于net.AddressInfo类型,之后就能安全访问address属性:
import net from 'net'; const getNetworkIP = (callback: (err: Error | undefined, ip: string | 'error') => void) => { const socket = net.createConnection(80, 'www.google.com'); socket.on('connect', function () { const sa = socket.address(); // 类型守卫:过滤无效类型,缩小类型范围 if (sa && typeof sa === 'object' && 'address' in sa) { callback(undefined, sa.address); } else { callback(new Error('无法获取有效IP地址'), 'error'); } socket.end(); }); socket.on('error', function (e) { callback(e, 'error'); }); };
这里的条件判断会让TypeScript自动将sa的类型缩小为net.AddressInfo,同时处理了sa为null或其他非对象类型的情况。
2. 结合可选链与空值合并简化处理
如果确定多数场景下返回的是AddressInfo类型,可以用可选链?.和空值合并??快速处理,同时避免报错:
import net from 'net'; const getNetworkIP = (callback: (err: Error | undefined, ip: string | 'error') => void) => { const socket = net.createConnection(80, 'www.google.com'); socket.on('connect', function () { const sa = socket.address(); const ip = (sa as net.AddressInfo)?.address ?? 'error'; if (ip !== 'error') { callback(undefined, ip); } else { callback(new Error('无法获取IP地址'), 'error'); } socket.end(); }); socket.on('error', function (e) { callback(e, 'error'); }); };
注意这里用了类型断言(sa as net.AddressInfo),但配合可选链可以避免类型不匹配时的运行时错误,适合对返回结果有明确预期的场景。
3. 完善回调函数的类型定义
建议把callback的any类型改为明确的函数类型,让TypeScript帮你提前发现潜在错误,比如示例中的(err: Error | undefined, ip: string | 'error') => void。
内容的提问来源于stack exchange,提问作者swftowu69
相关产品推荐
相关产品推荐

