HarmonyOS 鸿蒙Next:arkts-limited-stdlib禁用了Object下的方法使用,那如何实现2个Interface的拷贝呢?

发布于 1周前 作者 htzhanglong 来自 鸿蒙OS

HarmonyOS 鸿蒙Next:arkts-limited-stdlib禁用了Object下的方法使用,那如何实现2个Interface的拷贝呢?

限制使用标准库

规则:arkts-limited-stdlib

级别:错误

ArkTS不允许使用TypeScript或JavaScript标准库中的某些接口。大部分接口与动态特性有关。ArkTS中禁止使用以下接口:

全局对象的属性和方法:eval

ObjectprotodefineGetterdefineSetter、 lookupGetterlookupSetterassigncreate、 definePropertiesdefinePropertyfreeze、 fromEntriesgetOwnPropertyDescriptorgetOwnPropertyDescriptors、 getOwnPropertySymbols

getPrototypeOf、 hasOwnPropertyisisExtensibleisFrozen、 isPrototypeOfisSealedpreventExtensions、 propertyIsEnumerable

sealsetPrototypeOf

ReflectapplyconstructdefinePropertydeleteProperty、 getOwnPropertyDescriptorgetPrototypeOf、 isExtensiblepreventExtensions、 setPrototypeOf

Proxyhandler.apply()handler.construct()、 handler.defineProperty()handler.deleteProperty()handler.get()、 handler.getOwnPropertyDescriptor()handler.getPrototypeOf()、 handler.has()handler.isExtensible()handler.ownKeys()、 handler.preventExtensions()handler.set()handler.setPrototypeOf()

相关约束

  • 对象的属性名必须是合法的标识符
  • 不支持Symbol() API
  • 不支持通过索引访问字段
  • 仅允许在表达式中使用typeof运算符
  • 不支持in运算符
  • 不支持globalThis

interface Source {
name?: string;
age: number;
options: Record<string, string>;
}

interface Target {
name?: string;
age: number;
log?: string;
ext_options?: Record<string, string>;
options?: Record<string, string>;
}
let source: Source = {
age: 30,
options: {
‘name’: ‘tom’,
‘addr’: ‘target’
}
}
let target: Target = {
age: 40,
options: {
‘addr’: ‘source’
},
ext_options: {
‘age’: ‘33’
}
}

实现将source中的数据copy到targert中,target中有的字段souce中没有的字段还使用target的字段

8 回复
在ts文件里导出方法就行
// 封装方法
// 对象合并
assignFn(target: object,...source:object[]){
// 获取目标对象和第一个源对象的键数组
const targetKeys = Object.keys(target);
const sourceKeys = Object.keys(source[0]);

// 比较长度,确定使用哪个对象的键来进行遍历赋值
if (targetKeys.length > sourceKeys.length) {
for (let key of targetKeys) {
if (source[0][key]) {
target[key] = source[0][key];
} else {
target[key] = target[key];
}
}
} else {
for (let items of source) {
for (let key of Object.keys(items)) {
target[key] = source[key];
}
}
}
return target;
}

// 调用

assignFn({a:1},{a:2,b:1})

真的服了,Reflect.getMetadata被禁用了,class-transformer 库也没法用了。

就知道禁,你倒是给个数据转换的方案啊。

业务上肯定需要对对象的属性遍历 这都给禁止了怎么弄?

有Object.keys和values两个方法,或者参考先用Object.entries,再用for of 遍历,去拷贝

这些都给禁用了,我怎么实现服务器返回下划线数据转驼峰,怎么实现类似copy这种呢?

在HarmonyOS鸿蒙Next中,如果arkts-limited-stdlib禁用了Object下的方法使用,实现两个Interface的拷贝通常需要借助其他机制,因为传统的Java方式(如使用Object.clone()或序列化/反序列化)可能不再适用。

一种可行的方法是手动实现拷贝逻辑。由于Interface是抽象定义,你需要有一个具体的类实现这两个Interface,并在这个类中提供拷贝构造函数或拷贝方法。这种方法涉及以下步骤:

  1. 定义实现类:创建一个类实现这两个Interface。
  2. 实现拷贝逻辑:在该类中定义一个拷贝构造函数或一个静态方法,用于根据现有对象创建新对象,并手动复制各个字段的值。
  3. 使用拷贝方法:在需要拷贝对象时,调用这个拷贝构造函数或静态方法。

例如,如果你的两个Interface是InterfaceAInterfaceB,你可以创建一个类MyClass实现这两个Interface,并在MyClass中实现拷贝逻辑。

请注意,这种方法需要你对每个需要拷贝的类进行手动实现,可能会增加一些工作量。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部