ArkTS 解决ResponseResult传入数据data数据类型不统一

ResponseResult类


export default class ResponseResult {
  /**
   * Code returned by the network request: success, fail.
   */
  code: string;

  /**
   * Message returned by the network request.
   */
  msg: string | Resource;

  /**
   * Data returned by the network request.
   */
  data: Map<string,object>|string | Object | ArrayBuffer;

  constructor() {
    this.code = '';
    this.msg = '';
    this.data = '';
  }
}


比如我现在想要提取传入数据中data里面的token对应打的值,而且data是object类型
这里不能直接使用

const accessToken = (result as ResponseResult).data.access_token;

这里access_token会直接报错
Property 'access_token' does not exist on type 'string | Object | Map<string, object> | ArrayBuffer'. Property 'access_token' does not exist on type 'string'. <ArkTSCheck>

下面正确代码

interface GeneratedTypeLiteralInterface_1 {
  access_token: string;
}

....

            httpRequestPost('https://***',LoginData).then((result)=>{
              console.log('Result:', JSON.stringify(result, null, 2));
                if (result.code == "200") {
                  const data = (result as ResponseResult).data;
                  if (typeof data === 'object' && data !== null) {
                    const accessToken = (data as GeneratedTypeLiteralInterface_1).access_token;
                    if (accessToken) {
                      AlertDialog.show({
                        message: JSON.stringify(accessToken)
                      });
                    } else {
                      console.error("Access token is undefined or null.");
                    }
                  } else {
                    console.error("Data is not an object.");
                  }

                  router.replaceUrl({
                    url: 'pages/Index'
                  })
                } else if (result.code == "500") {
                  AlertDialog.show({
                    message: result.msg.toString()
                  })
                } else {
                  AlertDialog.show({
                    message: "未知错误"
                  })
                }

            })

....

下面是AI生成的解释

这段代码的主要目的是从一个可能包含不同类型值的变量中安全地提取access_token属性。下面是逐行解释:

  1. 定义接口

    interface GeneratedTypeLiteralInterface_1 {
      access_token: string;
    }

    这里定义了一个接口GeneratedTypeLiteralInterface_1,它有一个属性access_token,类型为string。这个接口用于类型断言,确保我们能够正确地访问access_token属性。

  2. 获取data

    const data = (result as ResponseResult).data;

    这一行将result对象的data属性赋值给变量dataresult被类型断言为ResponseResult,这是一个具体的类型或接口,表示result应该具有data属性。

  3. 检查data是否为对象

    if (typeof data === 'object' && data !== null) {

    这个条件语句检查data是否为非空对象。typeof data === 'object'确保data是一个对象类型,而data !== null确保data不是一个null值。

  4. 类型断言并提取access_token

    const accessToken = (data as GeneratedTypeLiteralInterface_1).access_token;

    如果data是一个对象,这一行将其类型断言为GeneratedTypeLiteralInterface_1。这样做的目的是让TypeScript知道我们期望data具有access_token属性,并且它的类型是string。然后,我们通过access_token属性获取该值,并将其赋值给accessToken

  5. 检查access_token是否存在且非空

    if (accessToken) {
      AlertDialog.show({
        message: JSON.stringify(accessToken)
      });
    } else {
      console.error("Access token is undefined or null.");
    }

    这一段代码检查accessToken是否定义且非空。如果access_token存在且不为空,它将显示一个包含access_token值的消息对话框。否则,它会在控制台中打印一条错误信息。

  6. 处理data不是对象的情况

    } else {
      console.error("Data is not an object.");
    }

    如果data不是对象或者它是null,则在控制台中打印一条错误信息。

总结来说,这段代码通过一系列的类型检查和类型断言,确保在访问access_token之前,data是一个有效的对象,并且该对象包含access_token属性。这样可以有效避免由于类型错误导致的运行时错误。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值