一、接口中不支持构造签名
规则:arkts-no-ctor-signatures-iface
级别:错误
ArkTS不支持在接口中使用构造签名。改用函数或者方法。
TypeScript
interfaceI{new(s: string):I}functionfn(i: I) {returnnewi('hello'); }
ArkTS
interfaceI{create(s: string):I}functionfn(i: I) {returni.create('hello'); }1.2.3.4.5.6.7.8.
相关约束
使用class而非具有构造签名的类型
不支持索引访问类型
规则:arkts-no-aliases-by-index
级别:错误
ArkTS不支持索引访问类型。
二、不支持通过索引访问字段
规则:arkts-no-props-by-index
级别:错误
ArkTS不支持动态声明字段,不支持动态访问字段。只能访问已在类中声明或者继承可见的字段,访问其他字段将会造成编译时错误。
使用点操作符访问字段,例如(obj.field),不支持索引访问(obj[field])。
ArkTS支持通过索引访问TypedArray(例如Int32Array)中的元素。
TypeScript
classPoint{x:string=''y:string=''}letp: Point = {x:'1',y:'2'};console.log(p['x']);classPerson{name:string=''age:number=0; [key:string]:string|number}letperson: Person = {name:'John',age:30,email:'***@example.com',phoneNumber:'18*********', }
ArkTS
classPoint{x:string=''y:string=''}letp: Point = {x:'1',y:'2'};console.log(p.x);classPerson{name:stringage:numberemail:stringphoneNumber:stringconstructor(name:string, age:number, email:string, phoneNumber:string){this.name = name;this.age = age;this.email = email;this.phoneNumber = phoneNumber; } }letperson =newPerson('John',30,'***@example.com','18*********');console.log(person['name']);// 编译时错误console.log(person.unknownProperty);// 编译时错误letarr =newInt32Array(1); arr[0];
三、不支持structural typing
规则:arkts-no-structural-typing
级别:错误
ArkTS不支持structural typing,编译器无法比较两种类型的publicAPI并决定它们是否相同。使用其他机制,例如继承、接口或类型别名。
TypeScript
interfaceI1 { f():string}interfaceI2 {// I2等价于I1f():string}classX{n:number=0s:string=''}classY{// Y等价于Xn:number=0s:string=''}letx =newX();lety =newY();console.log('Assign X to Y'); y = x;console.log('Assign Y to X'); x = y;functionfoo(x: X){console.log(x.n + x.s); }// 由于X和Y的API是等价的,所以X和Y是等价的foo(newX()); foo(newY());
ArkTS
interfaceI1 { f():string}typeI2 = I1// I2是I1的别名classB{n:number=0s:string=''}// D是B的继承类,构建了子类型和父类型的关系classDextendsB{constructor(){super() } }letb =newB();letd =newD();console.log('Assign D to B'); b = d;// 合法赋值,因为B是D的父类// 将b赋值给d将会引起编译时错误// d = binterfaceZ {n:numbers:string}// 类X implements 接口Z,构建了X和Y的关系classXimplementsZ{n:number=0s:string=''}// 类Y implements 接口Z,构建了X和Y的关系classYimplementsZ{n:number=0s:string=''}letx: Z =newX();lety: Z =newY();console.log('Assign X to Y'); y = x// 合法赋值,它们是相同的类型console.log('Assign Y to X'); x = y// 合法赋值,它们是相同的类型functionfoo(c: Z):void{console.log(c.n + c.s); }// 类X和类Y implement 相同的接口,因此下面的两个函数调用都是合法的foo(newX()); foo(newY());
本文根据HarmonyOS NEXT Developer Beta1官方公开的开发文档整理而成。