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

TypeScript中如何正确返回Promise?react-native-IAP类型错误解决

问题分析与解决方案

核心错误原因

你遇到的类型错误根源是**await的使用导致类型不匹配**:

  • IapIosSk2.subscriptionStatus('sku')返回的是Promise<ProductStatus[]>,但添加await后,stat已经是解析完成的ProductStatus[]数组,不再是Promise。
  • 但你强行将stat声明为Promise<ProductStatus[]>,TypeScript自然会报错——数组没有Promise的then/catch/finally这些方法。

额外的逻辑问题

除了类型错误,代码还有两处不合理的地方:

  1. 初始化顺序颠倒:react-native-iap要求先调用setup和initConnection完成初始化,才能调用subscriptionStatus这类业务API。
  2. 冗余的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:45:44