HarmonyOS 鸿蒙Next:如何根据数组动态生成type或interface?

发布于 1周前 作者 caililin 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next:如何根据数组动态生成type或interface?

let list = [
{
“icon_id”: “38240819”,
“name”: “back-icon”,
“font_class”: “arrow-ios-left”,
“unicode”: “e612”,
“unicode_decimal”: 58898
},
//…
] 

(封装iconfont字体图标)这个是我的数组 ,我想通过代码动态生成type, type FontType = ‘back-icon’ | … 这样封装的字体图标组件就有提示了。

我想实现这种,请问如何实现?

4 回复

src/main/ets/util/Page68TS.ts

export let list = [
  {
    "icon_id": "38240819",
    "name": "back-icon",
    "font_class": "arrow-ios-left",
    "unicode": "e612",
    "unicode_decimal": 58898
  }
// ... 其他元素
];

export function generateFontType(list: any[]): string { const names = list.map(item => item.name); const typeName = FontType; const unionType = names.join(’ | '); return type ${typeName} = ${unionType};; }

<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

src/main/ets/pages/Page68.ets

import { generateFontType, list } from ‘…/util/Page68TS’;

@Entry @Component struct Page68 { build() { Column() { Button(‘测试’).onClick(()=>{ const fontTypeDefinition = generateFontType(list); console.log(fontTypeDefinition:${fontTypeDefinition}); }) } .height(‘100%’) .width(‘100%’) } }

<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

打印

fontTypeDefinition:type FontType = back-icon;<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

你没听懂我的意思,你这不是通过代码生成一串字符串嘛, 我是想应用启动时, type FontType = ‘’ (function xx(): FontType { FontType = ‘back-icon’ | ‘xx-icon’ })()
之后在代码用FontType, 在调用组件时,就会有提示。我想应该实现不了。 我现在解决方案就是写一个脚本, 每次执行,生成字符串写入文件。

最后。 多谢!!!

在HarmonyOS或任何TypeScript/JavaScript环境中,你不能直接根据数组动态生成Type或Interface,因为TypeScript的类型定义(Type或Interface)在编译时就已经确定,而数组的内容是运行时才能确定的。

但你可以使用泛型(Generics)来定义一个能够处理任意类型数组的接口或类型,或者使用类型断言(Type Assertions)来指定数组元素的类型。对于更复杂的动态类型处理,可能需要考虑使用映射类型(Mapped Types)或条件类型(Conditional Types),但这些仍然是在编译时定义的。

如果问题依旧没法解决请加我微信,我的微信是itying888。

回到顶部