You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 00:50:21