如何不使用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
相关产品推荐
相关产品推荐

