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

AssemblyScript如何获取类的公共变量键值对?

在AssemblyScript中获取类的所有公共属性键值对

AssemblyScript作为静态类型语言,没有JavaScript中Object.keys这类动态遍历对象属性的原生方法,针对你的场景(20个公共属性,不想重复编写变量名),可以采用以下几种可行方案:

方案1:手动维护静态属性列表

这是最直接且稳定的方案,通过静态数组统一管理所有公共属性名,遍历数组即可获取对应键值对。

class Here {
  public id: string = "here"
  public dao: string = "good"
  // 静态数组存储所有公共属性名,新增属性时同步更新此处
  static publicProps: Array<string> = ["id", "dao"]

  good(): void {
    const propsMap = new Map<string, string>();
    for (const propName of Here.publicProps) {
      // @ts-ignore 跳过类型检查,避免动态属性访问报错
      propsMap.set(propName, this[propName]);
    }

    // 示例:遍历输出键值对
    for (const [key, value] of propsMap) {
      console.log(`${key}: ${value}`);
    }
  }
}

优点:实现简单,性能无损耗,无需额外编译配置;缺点:新增公共属性时需手动更新静态数组。

方案2:启用AssemblyScript反射API(实验性)

AssemblyScript提供了实验性的反射功能,编译时开启对应选项后,可通过反射API获取类的属性元信息。

编译配置

编译时需添加--reflect参数:

asc your-file.ts --reflect --target wasm32

代码实现

import { reflect } from "assemblyscript/reflection";

class Here {
  public id: string = "here"
  public dao: string = "good"

  good(): void {
    const classMetadata = reflect<Here>();
    const propsMap = new Map<string, string>();

    for (const prop of classMetadata.properties) {
      // 仅处理公共属性
      if (prop.isPublic) {
        // @ts-ignore 动态访问属性
        propsMap.set(prop.name, this[prop.name]);
      }
    }

    // 示例:遍历输出键值对
    for (const [key, value] of propsMap) {
      console.log(`${key}: ${value}`);
    }
  }
}

优点:无需手动维护属性列表,新增属性自动识别;缺点:反射为实验性功能,存在版本兼容性风险,且会带来一定性能开销。

方案3:使用装饰器自动收集属性

通过自定义装饰器,在编译阶段自动收集公共属性名到静态数组,新增属性时仅需添加装饰器即可。

编译配置

编译时需添加--decorators参数:

asc your-file.ts --decorators --target wasm32

代码实现

// 自定义装饰器:收集公共属性名到类的静态数组
function collectPublicProp(target: any, propertyKey: string): void {
  const constructor = target.constructor;
  if (!constructor.publicProps) {
    constructor.publicProps = [];
  }
  constructor.publicProps.push(propertyKey);
}

class Here {
  @collectPublicProp
  public id: string = "here"
  @collectPublicProp
  public dao: string = "good"

  good(): void {
    const propsMap = new Map<string, string>();
    // @ts-ignore 访问类的静态属性
    for (const propName of (this.constructor as any).publicProps) {
      // @ts-ignore 动态访问实例属性
      propsMap.set(propName, this[propName]);
    }

    // 示例:遍历输出键值对
    for (const [key, value] of propsMap) {
      console.log(`${key}: ${value}`);
    }
  }
}

优点:自动化程度高,新增属性仅需添加装饰器;缺点:需要配置编译选项,依赖AssemblyScript的装饰器支持。

内容的提问来源于stack exchange,提问作者Giorgi Lagidze

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 18:27:43