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

如何不使用any类型定义TypeScript Promise包装函数to()解决ESLint报错

解决方案

你可以通过TypeScript泛型来实现类型安全的to函数,完全不需要用到any类型,同时还能获得完整的类型推导能力。

方案1:保留原有使用习惯的实现

如果你不想改动现有调用逻辑,直接用泛型替换any即可:

const to = <T, E = Error>(promise: Promise<T>): Promise<T | E> => {
  return promise.then((data: T) => data).catch((err: E) => err);
};

这个实现会自动推导传入Promise的返回值类型,错误类型默认是Error,你也可以手动指定自定义错误类型。

方案2:更安全的Go风格元组返回(推荐)

原有实现没办法从类型层面区分返回值是成功数据还是错误,容易出现运行时错误。更推荐用元组的形式明确区分成功/失败状态:

const to = <T, E = Error>(promise: Promise<T>): Promise<[E, null] | [null, T]> => {
  return promise
    .then((data: T) => [null, data] as const)
    .catch((err: E) => [err, null] as const);
};

对应的调用逻辑调整如下,类型判断后会自动收窄类型:

const handleEmailLogin = async () => {
  const [err, loginResult] = await to(loginWithEmail(email, password));
  if (err) {
    setEmailLoginError(err.message);
    return;
  }
  // 此处loginResult会自动推导为firebase.login的返回值类型,可以直接使用
};

额外优化:loginWithEmail可以简化

现有loginWithEmail存在冗余包装的问题,修正后可以自动获得正确的类型推导:

// 不需要手动套Promise,也不需要加async标记,直接返回firebase.login的Promise即可
const loginWithEmail = (email:string, password:string) => {
  const firebase = getFirebase();
  return firebase.login({
    email,
    password
  });
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:39:02