TypeScript中如何正确返回Promise?react-native-IAP类型错误解决
问题分析与解决方案
核心错误原因
你遇到的类型错误根源是**await的使用导致类型不匹配**:
IapIosSk2.subscriptionStatus('sku')返回的是Promise<ProductStatus[]>,但添加await后,stat已经是解析完成的ProductStatus[]数组,不再是Promise。- 但你强行将
stat声明为Promise<ProductStatus[]>,TypeScript自然会报错——数组没有Promise的then/catch/finally这些方法。
额外的逻辑问题
除了类型错误,代码还有两处不合理的地方:
- 初始化顺序颠倒:react-native-iap要求先调用
setup和initConnection完成初始化,才能调用subscriptionStatus这类业务API。 - 冗余的Promise包裹:
nativeTest本身就是async函数,它的返回值会自动被包装成Promise,没必要手动new Promise嵌套。
修正后的代码
import { initConnection, IapIosSk2, setup, ProductStatus } from "react-native-iap"; async function nativeTest(): Promise<ProductStatus[]> { try { // 先完成库的初始化流程 setup({ storekitMode: 'STOREKIT2_MODE' }); await initConnection(); // initConnection是异步方法,必须等待执行完成 // 获取订阅状态,await后直接得到ProductStatus[],无需手动声明类型 const stat = await IapIosSk2.subscriptionStatus('sku'); // 遍历数组用for...of,for...in是遍历对象键的,不适合数组元素遍历 for (const data of stat) { console.log(data); } // 直接返回数组,async函数会自动包装为Promise<ProductStatus[]> return stat; } catch (e) { console.error('获取订阅状态失败:', e); // 要么抛出错误让调用者处理,要么返回默认空数组,保证返回类型符合声明 throw e; // 或者 return []; 可根据业务需求选择 } }
关键改动说明
- 移除
stat的错误类型声明,让TypeScript自动推断为ProductStatus[]。 - 调整初始化顺序:先
setup配置,再await initConnection完成连接,最后调用subscriptionStatus。 - 将
for...in改为for...of,正确遍历数组元素(for...in会遍历数组索引和原型链属性,不是你需要的元素内容)。 - 去掉冗余的
new Promise嵌套,直接返回stat即可。 - 优化错误处理逻辑,确保函数返回值符合
Promise<ProductStatus[]>的类型声明。
内容的提问来源于stack exchange,提问作者Michael Schmitz
相关产品推荐
相关产品推荐

