HarmonyOS 鸿蒙Next:arkts-limited-stdlib禁用了Object下的方法使用,那如何实现2个Interface的拷贝呢?
HarmonyOS 鸿蒙Next:arkts-limited-stdlib禁用了Object下的方法使用,那如何实现2个Interface的拷贝呢?
限制使用标准库
规则:arkts-limited-stdlib
级别:错误
ArkTS不允许使用TypeScript或JavaScript标准库中的某些接口。大部分接口与动态特性有关。ArkTS中禁止使用以下接口:
全局对象的属性和方法:eval
Object
:proto
、defineGetter
、defineSetter
、 lookupGetter
、lookupSetter
、assign
、create
、 defineProperties
、defineProperty
、freeze
、 fromEntries
、getOwnPropertyDescriptor
、getOwnPropertyDescriptors
、 getOwnPropertySymbols
、
getPrototypeOf
、 hasOwnProperty
、is
、isExtensible
、isFrozen
、 isPrototypeOf
、isSealed
、preventExtensions
、 propertyIsEnumerable
、
seal
、setPrototypeOf
Reflect
:apply
、construct
、defineProperty
、deleteProperty
、 getOwnPropertyDescriptor
、getPrototypeOf
、 isExtensible
、preventExtensions
、 setPrototypeOf
Proxy
:handler.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的字段
// 封装方法
// 对象合并
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 遍历,去拷贝
在HarmonyOS鸿蒙Next中,如果arkts-limited-stdlib
禁用了Object
下的方法使用,实现两个Interface的拷贝通常需要借助其他机制,因为传统的Java方式(如使用Object.clone()
或序列化/反序列化)可能不再适用。
一种可行的方法是手动实现拷贝逻辑。由于Interface是抽象定义,你需要有一个具体的类实现这两个Interface,并在这个类中提供拷贝构造函数或拷贝方法。这种方法涉及以下步骤:
- 定义实现类:创建一个类实现这两个Interface。
- 实现拷贝逻辑:在该类中定义一个拷贝构造函数或一个静态方法,用于根据现有对象创建新对象,并手动复制各个字段的值。
- 使用拷贝方法:在需要拷贝对象时,调用这个拷贝构造函数或静态方法。
例如,如果你的两个Interface是InterfaceA
和InterfaceB
,你可以创建一个类MyClass
实现这两个Interface,并在MyClass
中实现拷贝逻辑。
请注意,这种方法需要你对每个需要拷贝的类进行手动实现,可能会增加一些工作量。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html