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
相关产品推荐
相关产品推荐

