HarmonyOS鸿蒙Next中可以仅拿到interface里定义的字段并且判断数据非undefined的方法吗

HarmonyOS鸿蒙Next中可以仅拿到interface里定义的字段并且判断数据非undefined的方法吗 【问题描述】:

https://developer.huawei.com/consumer/cn/forum/topic/0207196017027402393?fid=0109140870620153026&pid=0302196442921318554

不用这个网址的解决方案,还有其他方案嘛

就是有个会员中心页面,在获取到数据的时候, 请求保存提交,会把额外的数据一并发送到后端来

只想要拿到定义的interface 中字段的值 但是解析的时候会出现把接口的值全部赋予这个detail: CircleDo = {} as CircleDo 接口的实例

可以仅拿到interface里定义的字段并且判断数据非undefined的方法吗?

【问题现象】:不涉及

【版本信息】:不涉及

【复现代码】:不涉及

【尝试解决方案】:不涉及


更多关于HarmonyOS鸿蒙Next中可以仅拿到interface里定义的字段并且判断数据非undefined的方法吗的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

自己写一个copy方法,一个个字段赋值给你的数据。通用的话可以用Object.keys获取到你的对象的key,再遍历key将json中的数据赋值到你的对象中,

更多关于HarmonyOS鸿蒙Next中可以仅拿到interface里定义的字段并且判断数据非undefined的方法吗的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


啊?我没理解错的话,你可以直接用"."操作符调用获取后判断

在HarmonyOS鸿蒙Next中,可以通过TypeScript的keyofin操作符结合类型守卫实现。使用keyof获取interface的键集合,遍历时用in确保只访问定义的字段。通过typeof检查undefined,或使用可选链?.配合??处理空值。例如:if (key in obj && obj[key] !== undefined)

在HarmonyOS Next的ArkTS开发中,你可以通过以下几种方式实现仅提取interface定义字段并过滤undefined值:

  1. 使用类型守卫与显式赋值
interface CircleDo {
  id: number;
  name: string;
  // ... 其他定义字段
}

function extractDefinedFields(data: any): Partial<CircleDo> {
  const result: Partial<CircleDo> = {};
  
  // 显式检查每个定义字段
  if (typeof data.id === 'number') result.id = data.id;
  if (typeof data.name === 'string') result.name = data.name;
  // ... 其他字段检查
  
  return result;
}
  1. 利用Object.keys与类型断言
function filterInterfaceFields<T extends object>(data: any, interfaceKeys: (keyof T)[]): T {
  const result = {} as T;
  
  interfaceKeys.forEach(key => {
    if (data[key] !== undefined) {
      result[key] = data[key];
    }
  });
  
  return result;
}

// 使用示例
const circleKeys: (keyof CircleDo)[] = ['id', 'name' /* ... */];
const filteredData = filterInterfaceFields<CircleDo>(apiResponse, circleKeys);
  1. 结合Pick和条件类型
type DefinedFields<T> = {
  [K in keyof T]: T[K] extends undefined ? never : T[K]
};

function extractDefined<T>(obj: any): DefinedFields<T> {
  const defined = {} as any;
  for (const key in obj) {
    if (obj[key] !== undefined) {
      defined[key] = obj[key];
    }
  }
  return defined;
}
  1. 使用类进行数据封装(推荐):
class CircleDoImpl implements CircleDo {
  id: number = 0;
  name: string = '';
  
  constructor(data?: any) {
    if (data) {
      // 仅赋值已定义且非undefined的字段
      Object.keys(this).forEach(key => {
        if (data[key] !== undefined) {
          this[key as keyof CircleDo] = data[key];
        }
      });
    }
  }
  
  toJSON() {
    return { ...this }; // 序列化时只包含类中定义的字段
  }
}

// 使用
const detail = new CircleDoImpl(apiResponse);
const jsonData = JSON.stringify(detail); // 仅包含interface定义字段

这些方法都能确保只获取interface中明确定义的字段,并自动过滤undefined值。类封装方案在类型安全和序列化控制方面表现最佳。

回到顶部