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

如何在TypeScript中为枚举键对应对象传递关联值?

解决方案:为Magic连接器动态传参并统一遍历处理

我们可以通过区分连接器的类型(实例/函数)来实现需求,同时保持TypeScript的类型安全性,避免滥用any:

1. 定义统一的连接器类型(可选但推荐)

先给所有连接器定义一个公共类型,替代any,让类型检查更严谨:

// 根据实际连接器的公共方法/属性定义,这里以connect为例
type Connector = {
  connect: () => Promise<any>;
  // 可补充其他公共属性如disconnect、getAccount等
};

2. 优化connectorsByName的类型声明

把原来的any替换为实例或函数的联合类型,让TypeScript能正确推断每个值的类型:

enum ConnectorNames {
  Injected = 'MetaMask',
  WalletConnect = 'WalletConnect',
  WalletLink = 'Coinbase Wallet',
  Magic = 'Email',
}

const connectorsByName: { [K in ConnectorNames]: Connector | ((email: string) => Connector) } = {
  [ConnectorNames.Injected]: injected,
  [ConnectorNames.WalletConnect]: walletconnect,
  [ConnectorNames.WalletLink]: walletlink,
  [ConnectorNames.Magic]: magic,
};

3. 在组件中动态处理传参

遍历的时候,通过枚举值判断是否是Magic连接器,调用函数并传入指定字符串;其他连接器直接使用实例:

const TestComponent = () => {
  const [connector, setConnector] = useState<Connector | null>(null);
  const targetEmail = 'test@gmail.com'; // 你需要传入的目标字符串

  return (
    <>
      {Object.entries(connectorsByName).map(([name, connectorItem]) => {
        return (
          <div
            className="bg-white rounded-lg p-4 hover:cursor-pointer min-w-[25vw]"
            key={name}
            onClick={() => {
              let finalConnector: Connector;
              // 针对Magic连接器调用函数传参
              if (name === ConnectorNames.Magic) {
                finalConnector = connectorItem(targetEmail);
              } else {
                finalConnector = connectorItem;
              }
              setConnector(finalConnector);
            }}
          >
            {name}
          </div>
        );
      })}
    </>
  );
};

export default TestComponent;

另一种简化方式(通过typeof判断)

如果不需要依赖枚举值判断,也可以直接通过typeof检测是否为函数:

onClick={() => {
  const finalConnector = typeof connectorItem === 'function' 
    ? connectorItem(targetEmail) 
    : connectorItem;
  setConnector(finalConnector);
}}

这样既满足了Magic连接器需要传参的需求,又能让其他连接器保持原有逻辑,同时保证了TypeScript的类型安全。

内容的提问来源于stack exchange,提问作者Tyler Pashigian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 13:50:18