1e41f4b71Sopenharmony_ci# Sendable使用规则与约束 2e41f4b71Sopenharmony_ci 3e41f4b71Sopenharmony_ci## Sendable class只能继承自Sendable class 4e41f4b71Sopenharmony_ci 5e41f4b71Sopenharmony_ci> **说明:** 6e41f4b71Sopenharmony_ci> 7e41f4b71Sopenharmony_ci> 这里的class不包括变量。Sendable class不能继承自变量。 8e41f4b71Sopenharmony_ci 9e41f4b71Sopenharmony_ci**正例:** 10e41f4b71Sopenharmony_ci 11e41f4b71Sopenharmony_ci```ts 12e41f4b71Sopenharmony_ci@Sendable 13e41f4b71Sopenharmony_ciclass A { 14e41f4b71Sopenharmony_ci constructor() { 15e41f4b71Sopenharmony_ci } 16e41f4b71Sopenharmony_ci} 17e41f4b71Sopenharmony_ci 18e41f4b71Sopenharmony_ci@Sendable 19e41f4b71Sopenharmony_ciclass B extends A { 20e41f4b71Sopenharmony_ci constructor() { 21e41f4b71Sopenharmony_ci super() 22e41f4b71Sopenharmony_ci } 23e41f4b71Sopenharmony_ci} 24e41f4b71Sopenharmony_ci``` 25e41f4b71Sopenharmony_ci 26e41f4b71Sopenharmony_ci**反例:** 27e41f4b71Sopenharmony_ci 28e41f4b71Sopenharmony_ci```ts 29e41f4b71Sopenharmony_ciclass A { 30e41f4b71Sopenharmony_ci constructor() { 31e41f4b71Sopenharmony_ci } 32e41f4b71Sopenharmony_ci} 33e41f4b71Sopenharmony_ci 34e41f4b71Sopenharmony_ci@Sendable 35e41f4b71Sopenharmony_ciclass B extends A { 36e41f4b71Sopenharmony_ci constructor() { 37e41f4b71Sopenharmony_ci super() 38e41f4b71Sopenharmony_ci } 39e41f4b71Sopenharmony_ci} 40e41f4b71Sopenharmony_ci``` 41e41f4b71Sopenharmony_ci 42e41f4b71Sopenharmony_ci 43e41f4b71Sopenharmony_ci## 非Sendable class只能继承自非Sendable class 44e41f4b71Sopenharmony_ci 45e41f4b71Sopenharmony_ci**正例:** 46e41f4b71Sopenharmony_ci 47e41f4b71Sopenharmony_ci```ts 48e41f4b71Sopenharmony_ciclass A { 49e41f4b71Sopenharmony_ci constructor() { 50e41f4b71Sopenharmony_ci } 51e41f4b71Sopenharmony_ci} 52e41f4b71Sopenharmony_ci 53e41f4b71Sopenharmony_ciclass B extends A { 54e41f4b71Sopenharmony_ci constructor() { 55e41f4b71Sopenharmony_ci super() 56e41f4b71Sopenharmony_ci } 57e41f4b71Sopenharmony_ci} 58e41f4b71Sopenharmony_ci``` 59e41f4b71Sopenharmony_ci 60e41f4b71Sopenharmony_ci**反例:** 61e41f4b71Sopenharmony_ci 62e41f4b71Sopenharmony_ci```ts 63e41f4b71Sopenharmony_ci@Sendable 64e41f4b71Sopenharmony_ciclass A { 65e41f4b71Sopenharmony_ci constructor() { 66e41f4b71Sopenharmony_ci } 67e41f4b71Sopenharmony_ci} 68e41f4b71Sopenharmony_ci 69e41f4b71Sopenharmony_ciclass B extends A { 70e41f4b71Sopenharmony_ci constructor() { 71e41f4b71Sopenharmony_ci super() 72e41f4b71Sopenharmony_ci } 73e41f4b71Sopenharmony_ci} 74e41f4b71Sopenharmony_ci``` 75e41f4b71Sopenharmony_ci 76e41f4b71Sopenharmony_ci 77e41f4b71Sopenharmony_ci## 非Sendable class只能实现非Sendable interface 78e41f4b71Sopenharmony_ci 79e41f4b71Sopenharmony_ci**正例:** 80e41f4b71Sopenharmony_ci 81e41f4b71Sopenharmony_ci```ts 82e41f4b71Sopenharmony_ciinterface I {}; 83e41f4b71Sopenharmony_ci 84e41f4b71Sopenharmony_ciclass B implements I {}; 85e41f4b71Sopenharmony_ci``` 86e41f4b71Sopenharmony_ci 87e41f4b71Sopenharmony_ci**反例:** 88e41f4b71Sopenharmony_ci 89e41f4b71Sopenharmony_ci```ts 90e41f4b71Sopenharmony_ciimport { lang } from '@kit.ArkTS'; 91e41f4b71Sopenharmony_ci 92e41f4b71Sopenharmony_citype ISendable = lang.ISendable; 93e41f4b71Sopenharmony_ci 94e41f4b71Sopenharmony_ciinterface I extends ISendable {}; 95e41f4b71Sopenharmony_ci 96e41f4b71Sopenharmony_ciclass B implements I {}; 97e41f4b71Sopenharmony_ci``` 98e41f4b71Sopenharmony_ci 99e41f4b71Sopenharmony_ci 100e41f4b71Sopenharmony_ci## Sendable class/interface成员变量必须是Sendable支持的数据类型 101e41f4b71Sopenharmony_ci 102e41f4b71Sopenharmony_ci**正例:** 103e41f4b71Sopenharmony_ci 104e41f4b71Sopenharmony_ci```ts 105e41f4b71Sopenharmony_ci@Sendable 106e41f4b71Sopenharmony_ciclass A { 107e41f4b71Sopenharmony_ci constructor() { 108e41f4b71Sopenharmony_ci } 109e41f4b71Sopenharmony_ci a: number = 0; 110e41f4b71Sopenharmony_ci} 111e41f4b71Sopenharmony_ci``` 112e41f4b71Sopenharmony_ci 113e41f4b71Sopenharmony_ci**反例:** 114e41f4b71Sopenharmony_ci 115e41f4b71Sopenharmony_ci```ts 116e41f4b71Sopenharmony_ci@Sendable 117e41f4b71Sopenharmony_ciclass A { 118e41f4b71Sopenharmony_ci constructor() { 119e41f4b71Sopenharmony_ci } 120e41f4b71Sopenharmony_ci b: Array<number> = [1, 2, 3] // 需使用collections.Array 121e41f4b71Sopenharmony_ci} 122e41f4b71Sopenharmony_ci``` 123e41f4b71Sopenharmony_ci 124e41f4b71Sopenharmony_ci 125e41f4b71Sopenharmony_ci## Sendable class/interface的成员变量不支持使用!断言 126e41f4b71Sopenharmony_ci 127e41f4b71Sopenharmony_ci**正例:** 128e41f4b71Sopenharmony_ci 129e41f4b71Sopenharmony_ci```ts 130e41f4b71Sopenharmony_ci@Sendable 131e41f4b71Sopenharmony_ciclass A { 132e41f4b71Sopenharmony_ci constructor() { 133e41f4b71Sopenharmony_ci } 134e41f4b71Sopenharmony_ci a: number = 0; 135e41f4b71Sopenharmony_ci} 136e41f4b71Sopenharmony_ci``` 137e41f4b71Sopenharmony_ci 138e41f4b71Sopenharmony_ci**反例:** 139e41f4b71Sopenharmony_ci 140e41f4b71Sopenharmony_ci```ts 141e41f4b71Sopenharmony_ci@Sendable 142e41f4b71Sopenharmony_ciclass A { 143e41f4b71Sopenharmony_ci constructor() { 144e41f4b71Sopenharmony_ci } 145e41f4b71Sopenharmony_ci a!: number; 146e41f4b71Sopenharmony_ci} 147e41f4b71Sopenharmony_ci``` 148e41f4b71Sopenharmony_ci 149e41f4b71Sopenharmony_ci 150e41f4b71Sopenharmony_ci## Sendable class/interface的成员变量不支持使用计算属性名 151e41f4b71Sopenharmony_ci 152e41f4b71Sopenharmony_ci**正例:** 153e41f4b71Sopenharmony_ci 154e41f4b71Sopenharmony_ci```ts 155e41f4b71Sopenharmony_ci@Sendable 156e41f4b71Sopenharmony_ciclass A { 157e41f4b71Sopenharmony_ci num1: number = 1; 158e41f4b71Sopenharmony_ci num2: number = 2; 159e41f4b71Sopenharmony_ci add(): number { 160e41f4b71Sopenharmony_ci return this.num1 + this.num2; 161e41f4b71Sopenharmony_ci } 162e41f4b71Sopenharmony_ci} 163e41f4b71Sopenharmony_ci``` 164e41f4b71Sopenharmony_ci 165e41f4b71Sopenharmony_ci**反例:** 166e41f4b71Sopenharmony_ci 167e41f4b71Sopenharmony_ci```ts 168e41f4b71Sopenharmony_cienum B { 169e41f4b71Sopenharmony_ci b1 = "bbb" 170e41f4b71Sopenharmony_ci} 171e41f4b71Sopenharmony_ci@Sendable 172e41f4b71Sopenharmony_ciclass A { 173e41f4b71Sopenharmony_ci ["aaa"]: number = 1; // ["aaa"] is allowed in other classes in ets files 174e41f4b71Sopenharmony_ci [B.b1]: number = 2; // [B.b1] is allowed in other classes in ets files 175e41f4b71Sopenharmony_ci} 176e41f4b71Sopenharmony_ci``` 177e41f4b71Sopenharmony_ci 178e41f4b71Sopenharmony_ci 179e41f4b71Sopenharmony_ci## 泛型类中的Sendable class,collections.Array,collections.Map,collections.Set的模板类型必须是Sendable类型 180e41f4b71Sopenharmony_ci 181e41f4b71Sopenharmony_ci**正例:** 182e41f4b71Sopenharmony_ci 183e41f4b71Sopenharmony_ci```ts 184e41f4b71Sopenharmony_ciimport { collections } from '@kit.ArkTS'; 185e41f4b71Sopenharmony_ci 186e41f4b71Sopenharmony_citry { 187e41f4b71Sopenharmony_ci let arr1: collections.Array<number> = new collections.Array<number>(); 188e41f4b71Sopenharmony_ci let num: number = 1; 189e41f4b71Sopenharmony_ci arr1.push(num) 190e41f4b71Sopenharmony_ci} catch (e) { 191e41f4b71Sopenharmony_ci console.error(`taskpool execute: Code: ${e.code}, message: ${e.message}`); 192e41f4b71Sopenharmony_ci} 193e41f4b71Sopenharmony_ci``` 194e41f4b71Sopenharmony_ci 195e41f4b71Sopenharmony_ci**反例:** 196e41f4b71Sopenharmony_ci 197e41f4b71Sopenharmony_ci```ts 198e41f4b71Sopenharmony_ciimport { collections } from '@kit.ArkTS'; 199e41f4b71Sopenharmony_ci 200e41f4b71Sopenharmony_citry { 201e41f4b71Sopenharmony_ci let arr1: collections.Array<Array<number>> = new collections.Array<Array<number>>(); 202e41f4b71Sopenharmony_ci let arr2: Array<number> = new Array<number>() 203e41f4b71Sopenharmony_ci arr2.push(1) 204e41f4b71Sopenharmony_ci arr1.push(arr2) 205e41f4b71Sopenharmony_ci} catch (e) { 206e41f4b71Sopenharmony_ci console.error(`taskpool execute: Code: ${e.code}, message: ${e.message}`); 207e41f4b71Sopenharmony_ci} 208e41f4b71Sopenharmony_ci``` 209e41f4b71Sopenharmony_ci 210e41f4b71Sopenharmony_ci 211e41f4b71Sopenharmony_ci## Sendable class的内部不允许使用当前模块内上下文环境中定义的变量 212e41f4b71Sopenharmony_ci 213e41f4b71Sopenharmony_ci由于Sendable对象在不同并发实例间的上下文环境不同,如果直接访问会有非预期行为。不支持Sendable对象使用当前模块内上下文环境中定义的变量,如果违反,编译阶段会报错。 214e41f4b71Sopenharmony_ci 215e41f4b71Sopenharmony_ci> **说明:** 216e41f4b71Sopenharmony_ci> 217e41f4b71Sopenharmony_ci> 从API version 12开始,sendable class的内部支持使用top level的sendable class对象。 218e41f4b71Sopenharmony_ci 219e41f4b71Sopenharmony_ci**正例:** 220e41f4b71Sopenharmony_ci 221e41f4b71Sopenharmony_ci```ts 222e41f4b71Sopenharmony_ciimport { lang } from '@kit.ArkTS'; 223e41f4b71Sopenharmony_ci 224e41f4b71Sopenharmony_citype ISendable = lang.ISendable; 225e41f4b71Sopenharmony_ci 226e41f4b71Sopenharmony_ciinterface I extends ISendable {} 227e41f4b71Sopenharmony_ci 228e41f4b71Sopenharmony_ci@Sendable 229e41f4b71Sopenharmony_ciclass B implements I { 230e41f4b71Sopenharmony_ci static o: number = 1; 231e41f4b71Sopenharmony_ci static bar(): B { 232e41f4b71Sopenharmony_ci return new B(); 233e41f4b71Sopenharmony_ci } 234e41f4b71Sopenharmony_ci} 235e41f4b71Sopenharmony_ci 236e41f4b71Sopenharmony_ci@Sendable 237e41f4b71Sopenharmony_ciclass C { 238e41f4b71Sopenharmony_ci v: I = new B(); 239e41f4b71Sopenharmony_ci u: number = B.o; 240e41f4b71Sopenharmony_ci 241e41f4b71Sopenharmony_ci foo() { 242e41f4b71Sopenharmony_ci return B.bar(); 243e41f4b71Sopenharmony_ci } 244e41f4b71Sopenharmony_ci} 245e41f4b71Sopenharmony_ci``` 246e41f4b71Sopenharmony_ci 247e41f4b71Sopenharmony_ci**反例:** 248e41f4b71Sopenharmony_ci 249e41f4b71Sopenharmony_ci```ts 250e41f4b71Sopenharmony_ciimport { lang } from '@kit.ArkTS'; 251e41f4b71Sopenharmony_ci 252e41f4b71Sopenharmony_citype ISendable = lang.ISendable; 253e41f4b71Sopenharmony_ci 254e41f4b71Sopenharmony_ciinterface I extends ISendable {} 255e41f4b71Sopenharmony_ci 256e41f4b71Sopenharmony_ci@Sendable 257e41f4b71Sopenharmony_ciclass B implements I {} 258e41f4b71Sopenharmony_ci 259e41f4b71Sopenharmony_cifunction bar(): B { 260e41f4b71Sopenharmony_ci return new B(); 261e41f4b71Sopenharmony_ci} 262e41f4b71Sopenharmony_ci 263e41f4b71Sopenharmony_cilet b = new B(); 264e41f4b71Sopenharmony_ci 265e41f4b71Sopenharmony_ci{ 266e41f4b71Sopenharmony_ci @Sendable 267e41f4b71Sopenharmony_ci class A implements I {} 268e41f4b71Sopenharmony_ci 269e41f4b71Sopenharmony_ci @Sendable 270e41f4b71Sopenharmony_ci class C { 271e41f4b71Sopenharmony_ci u: I = bar(); // bar不是sendable class对象,编译报错 272e41f4b71Sopenharmony_ci v: I = new A(); // A不是定义在top level中,编译报错 273e41f4b71Sopenharmony_ci 274e41f4b71Sopenharmony_ci foo() { 275e41f4b71Sopenharmony_ci return b; // b不是sendable class对象,而是sendable class的实例,编译报错 276e41f4b71Sopenharmony_ci } 277e41f4b71Sopenharmony_ci } 278e41f4b71Sopenharmony_ci} 279e41f4b71Sopenharmony_ci``` 280e41f4b71Sopenharmony_ci 281e41f4b71Sopenharmony_ci 282e41f4b71Sopenharmony_ci## Sendable class和Sendable function不能使用除了\@Sendable的其它装饰器 283e41f4b71Sopenharmony_ci 284e41f4b71Sopenharmony_ci如果类装饰器定义在ts文件中,产生修改类的布局的行为,那么会造成运行时的错误。 285e41f4b71Sopenharmony_ci 286e41f4b71Sopenharmony_ci**正例:** 287e41f4b71Sopenharmony_ci 288e41f4b71Sopenharmony_ci```ts 289e41f4b71Sopenharmony_ci@Sendable 290e41f4b71Sopenharmony_ciclass A { 291e41f4b71Sopenharmony_ci num: number = 1; 292e41f4b71Sopenharmony_ci} 293e41f4b71Sopenharmony_ci``` 294e41f4b71Sopenharmony_ci 295e41f4b71Sopenharmony_ci**反例:** 296e41f4b71Sopenharmony_ci 297e41f4b71Sopenharmony_ci```ts 298e41f4b71Sopenharmony_ci@Sendable 299e41f4b71Sopenharmony_ci@Observed 300e41f4b71Sopenharmony_ciclass C { 301e41f4b71Sopenharmony_ci num: number = 1; 302e41f4b71Sopenharmony_ci} 303e41f4b71Sopenharmony_ci``` 304e41f4b71Sopenharmony_ci 305e41f4b71Sopenharmony_ci 306e41f4b71Sopenharmony_ci## 不能使用对象字面量/数组字面量初始化Sendable类型 307e41f4b71Sopenharmony_ci 308e41f4b71Sopenharmony_ciSendable数据类型只能通过Sendable类型的new表达式创建。 309e41f4b71Sopenharmony_ci 310e41f4b71Sopenharmony_ci**正例:** 311e41f4b71Sopenharmony_ci 312e41f4b71Sopenharmony_ci```ts 313e41f4b71Sopenharmony_ciimport { collections } from '@kit.ArkTS'; 314e41f4b71Sopenharmony_ci 315e41f4b71Sopenharmony_cilet arr1: collections.Array<number> = new collections.Array<number>(1, 2, 3); // 是Sendable类型 316e41f4b71Sopenharmony_ci``` 317e41f4b71Sopenharmony_ci 318e41f4b71Sopenharmony_ci**反例:** 319e41f4b71Sopenharmony_ci 320e41f4b71Sopenharmony_ci```ts 321e41f4b71Sopenharmony_ciimport { collections } from '@kit.ArkTS'; 322e41f4b71Sopenharmony_ci 323e41f4b71Sopenharmony_cilet arr2: collections.Array<number> = [1, 2, 3]; // 不是Sendable类型,编译报错 324e41f4b71Sopenharmony_cilet arr3: number[] = [1, 2, 3]; // 不是Sendable类型,正例,不报错 325e41f4b71Sopenharmony_cilet arr4: number[] = new collections.Array<number>(1, 2, 3); // 编译报错 326e41f4b71Sopenharmony_ci``` 327e41f4b71Sopenharmony_ci 328e41f4b71Sopenharmony_ci 329e41f4b71Sopenharmony_ci## 非Sendable类型不可以as成Sendable类型 330e41f4b71Sopenharmony_ci 331e41f4b71Sopenharmony_ci> **说明:** 332e41f4b71Sopenharmony_ci> 333e41f4b71Sopenharmony_ci> Sendable类型在不违反Sendable规则的前提下需要和非Sendable类型行为兼容,因此Sendable类型可以as成非Sendable类型。 334e41f4b71Sopenharmony_ci 335e41f4b71Sopenharmony_ci**正例:** 336e41f4b71Sopenharmony_ci 337e41f4b71Sopenharmony_ci```ts 338e41f4b71Sopenharmony_ciclass A { 339e41f4b71Sopenharmony_ci state: number = 0; 340e41f4b71Sopenharmony_ci} 341e41f4b71Sopenharmony_ci 342e41f4b71Sopenharmony_ci@Sendable 343e41f4b71Sopenharmony_ciclass SendableA { 344e41f4b71Sopenharmony_ci state: number = 0; 345e41f4b71Sopenharmony_ci} 346e41f4b71Sopenharmony_ci 347e41f4b71Sopenharmony_cilet a1: A = new SendableA() as A; 348e41f4b71Sopenharmony_ci``` 349e41f4b71Sopenharmony_ci 350e41f4b71Sopenharmony_ci**反例:** 351e41f4b71Sopenharmony_ci 352e41f4b71Sopenharmony_ci```ts 353e41f4b71Sopenharmony_ciclass A { 354e41f4b71Sopenharmony_ci state: number = 0; 355e41f4b71Sopenharmony_ci} 356e41f4b71Sopenharmony_ci 357e41f4b71Sopenharmony_ci@Sendable 358e41f4b71Sopenharmony_ciclass SendableA { 359e41f4b71Sopenharmony_ci state: number = 0; 360e41f4b71Sopenharmony_ci} 361e41f4b71Sopenharmony_ci 362e41f4b71Sopenharmony_cilet a2: SendableA = new A() as SendableA; 363e41f4b71Sopenharmony_ci``` 364e41f4b71Sopenharmony_ci 365e41f4b71Sopenharmony_ci 366e41f4b71Sopenharmony_ci## 箭头函数不支持共享 367e41f4b71Sopenharmony_ci 368e41f4b71Sopenharmony_ci箭头函数不支持使用Sendable装饰器。 369e41f4b71Sopenharmony_ci 370e41f4b71Sopenharmony_ci**正例:** 371e41f4b71Sopenharmony_ci 372e41f4b71Sopenharmony_ci```ts 373e41f4b71Sopenharmony_ci@Sendable 374e41f4b71Sopenharmony_citype SendableFuncType = () => void; 375e41f4b71Sopenharmony_ci 376e41f4b71Sopenharmony_ci@Sendable 377e41f4b71Sopenharmony_cifunction SendableFunc() { 378e41f4b71Sopenharmony_ci console.info("Sendable func"); 379e41f4b71Sopenharmony_ci} 380e41f4b71Sopenharmony_ci 381e41f4b71Sopenharmony_ci@Sendable 382e41f4b71Sopenharmony_ciclass SendableClass { 383e41f4b71Sopenharmony_ci constructor(f: SendableFuncType) { 384e41f4b71Sopenharmony_ci this.func = f; 385e41f4b71Sopenharmony_ci } 386e41f4b71Sopenharmony_ci func: SendableFuncType; 387e41f4b71Sopenharmony_ci} 388e41f4b71Sopenharmony_ci 389e41f4b71Sopenharmony_cilet sendableClass = new SendableClass(SendableFunc) 390e41f4b71Sopenharmony_ci``` 391e41f4b71Sopenharmony_ci 392e41f4b71Sopenharmony_ci**反例:** 393e41f4b71Sopenharmony_ci 394e41f4b71Sopenharmony_ci```ts 395e41f4b71Sopenharmony_ci@Sendable 396e41f4b71Sopenharmony_citype SendableFuncType = () => void; 397e41f4b71Sopenharmony_cilet func: SendableFuncType = () => {}; // 编译报错 398e41f4b71Sopenharmony_ci 399e41f4b71Sopenharmony_ci@Sendable 400e41f4b71Sopenharmony_ciclass SendableClass { 401e41f4b71Sopenharmony_ci func: SendableFuncType = () => {}; // 编译报错 402e41f4b71Sopenharmony_ci} 403e41f4b71Sopenharmony_ci``` 404e41f4b71Sopenharmony_ci 405e41f4b71Sopenharmony_ci 406e41f4b71Sopenharmony_ci## Sendable装饰器修饰类型时仅支持修饰函数类型 407e41f4b71Sopenharmony_ci 408e41f4b71Sopenharmony_ciSendable装饰器修饰类型时仅支持修饰函数类型。 409e41f4b71Sopenharmony_ci 410e41f4b71Sopenharmony_ci**正例:** 411e41f4b71Sopenharmony_ci 412e41f4b71Sopenharmony_ci```ts 413e41f4b71Sopenharmony_ci@Sendable 414e41f4b71Sopenharmony_citype SendableFuncType = () => void; 415e41f4b71Sopenharmony_ci``` 416e41f4b71Sopenharmony_ci 417e41f4b71Sopenharmony_ci**反例:** 418e41f4b71Sopenharmony_ci 419e41f4b71Sopenharmony_ci```ts 420e41f4b71Sopenharmony_ci@Sendable 421e41f4b71Sopenharmony_citype A = number; // 编译报错 422e41f4b71Sopenharmony_ci 423e41f4b71Sopenharmony_ci@Sendable 424e41f4b71Sopenharmony_ciclass C {} 425e41f4b71Sopenharmony_ci 426e41f4b71Sopenharmony_ci@Sendable 427e41f4b71Sopenharmony_citype D = C; // 编译报错 428e41f4b71Sopenharmony_ci``` 429e41f4b71Sopenharmony_ci 430e41f4b71Sopenharmony_ci 431e41f4b71Sopenharmony_ci## 注意事项 432e41f4b71Sopenharmony_ci 433e41f4b71Sopenharmony_ci 434e41f4b71Sopenharmony_ci在HAR中使用Sendable时,需开启编译生成TS文件的配置。详情可查[编译生成TS文件](../quick-start/har-package.md#编译生成ts文件)。 435e41f4b71Sopenharmony_ci 436e41f4b71Sopenharmony_ci 437e41f4b71Sopenharmony_ci## 与TS/JS交互的规则 438e41f4b71Sopenharmony_ci 439e41f4b71Sopenharmony_ci 440e41f4b71Sopenharmony_ci### ArkTS通用规则(目前只针对Sendable对象) 441e41f4b71Sopenharmony_ci 442e41f4b71Sopenharmony_ci| 规则 | 443e41f4b71Sopenharmony_ci| -------- | 444e41f4b71Sopenharmony_ci| Sendable对象传入TS/JS的接口中,禁止操作其对象布局(增、删属性,改变属性类型)。 | 445e41f4b71Sopenharmony_ci| Sendable对象设置到TS/JS的对象上,TS中获取到这个Sendable对象后,禁止操作其对象布局(增、删属性,改变属性类型)。 | 446e41f4b71Sopenharmony_ci| Sendable对象放入TS/JS的容器中,TS中获取到这个Sendable对象后,禁止操作其对象布局(增、删属性,改变属性类型)。 | 447e41f4b71Sopenharmony_ci 448e41f4b71Sopenharmony_ci> **说明:** 449e41f4b71Sopenharmony_ci> 450e41f4b71Sopenharmony_ci> 此处改变属性类型不包括Sendable对象类型的改变,比如从Sendable class A 变为Sendable class B。 451e41f4b71Sopenharmony_ci 452e41f4b71Sopenharmony_ci 453e41f4b71Sopenharmony_ci### NAPI规则(目前只针对Sendable对象) 454e41f4b71Sopenharmony_ci 455e41f4b71Sopenharmony_ci| 规则 | 456e41f4b71Sopenharmony_ci| -------- | 457e41f4b71Sopenharmony_ci| 禁止删除属性,不能使用的接口有:napi_delete_property。 | 458e41f4b71Sopenharmony_ci| 禁止新增属性,不能使用的接口有:napi_set_property、napi_set_named_property、napi_define_properties。 | 459e41f4b71Sopenharmony_ci| 禁止修改属性类型,不能使用的接口有:napi_set_property、napi_set_named_property、napi_define_properties。 | 460e41f4b71Sopenharmony_ci| 不支持Symbol相关接口和类型,不能使用的接口有:napi_create_symbol、napi_is_symbol_object、napi_symbol。 | 461e41f4b71Sopenharmony_ci 462e41f4b71Sopenharmony_ci 463e41f4b71Sopenharmony_ci## 与UI交互的规则 464e41f4b71Sopenharmony_ci 465e41f4b71Sopenharmony_ciSendable数据需要与[makeObserved](../quick-start/arkts-new-makeObserved.md)联用,才可以观察Sendable对象的数据变化,具体使用请参考[makeObserved和@Sendable装饰的class配合文档](quick-start/arkts-new-makeObserved.md#makeobserved和sendable装饰的class配合使用)。 466