当前位置: 首页 > news >正文

HarmonyOS Next原生应用开发-从TS到ArkTS的适配规则(九)

一、需要显式标注泛型函数类型实参
规则:arkts-no-inferred-generic-params
级别:错误
如果可以从传递给泛型函数的参数中推断出具体类型,ArkTS允许省略泛型类型实参。否则,省略泛型类型实参会发生编译时错误。
禁止仅基于泛型函数返回类型推断泛型类型参数。
TypeScript

function choose<T>(x: T, y: T): T {return Math.random() < 0.5 ? x: y;
}let x = choose(10, 20);   // 推断choose<number>(...)
let y = choose('10', 20); // 编译时错误function greet<T>(): T {return 'Hello' as T;
}
let z = greet() // T的类型被推断为“unknown”

ArkTS

function choose<T>(x: T, y: T): T {return Math.random() < 0.5 ? x: y;
}let x = choose(10, 20);   // 推断choose<number>(...)
let y = choose('10', 20); // 编译时错误function greet<T>(): T {return 'Hello' as T;
}
let z = greet<string>();

二、需要显式标注对象字面量的类型
规则:arkts-no-untyped-obj-literals
级别:错误
在ArkTS中,需要显式标注对象字面量的类型,否则,将发生编译时错误。在某些场景下,编译器可以根据上下文推断出字面量的类型。
在以下上下文中不支持使用字面量初始化类和接口:
初始化具有any、Object或object类型的任何对象
初始化带有方法的类或接口
初始化包含自定义含参数的构造函数的类
初始化带readonly字段的类
例子1
TypeScript

let o1 = {n: 42, s: 'foo'};
let o2: Object = {n: 42, s: 'foo'};
let o3: object = {n: 42, s: 'foo'};let oo: Object[] = [{n: 1, s: '1'}, {n: 2, s: '2'}];

ArkTS

class C1 {n: number = 0s: string = ''
}let o1: C1 = {n: 42, s: 'foo'};
let o2: C1 = {n: 42, s: 'foo'};
let o3: C1 = {n: 42, s: 'foo'};let oo: C1[] = [{n: 1, s: '1'}, {n: 2, s: '2'}];

例子2
TypeScript

class C2 {s: stringconstructor(s: string) {this.s = 's =' + s;}
}
let o4: C2 = {s: 'foo'};

ArkTS

class C2 {s: stringconstructor(s: string) {this.s = 's =' + s;}
}
let o4 = new C2('foo');

例子3
TypeScript

class C3 {readonly n: number = 0readonly s: string = ''
}
let o5: C3 = {n: 42, s: 'foo'};

ArkTS

class C3 {n: number = 0s: string = ''
}
let o5: C3 = {n: 42, s: 'foo'};

例子4
TypeScript

abstract class A {}
let o6: A = {};

ArkTS

abstract class A {}
class C extends A {}
let o6: C = {}; // 或 let o6: C = new C()

例子5
TypeScript

class C4 {n: number = 0s: string = ''f() {console.log('Hello');}
}
let o7: C4 = {n: 42, s: 'foo', f: () => {}};

ArkTS

class C4 {n: number = 0s: string = ''f() {console.log('Hello');}
}
let o7 = new C4();
o7.n = 42;
o7.s = 'foo';

例子6
TypeScript

class Point {x: number = 0y: number = 0
}function getPoint(o: Point): Point {return o;
}// TS支持structural typing,可以推断p的类型为Point
let p = {x: 5, y: 10};
getPoint(p);// 可通过上下文推断出对象字面量的类型为Point
getPoint({x: 5, y: 10});

ArkTS

class Point {x: number = 0y: number = 0// 在字面量初始化之前,使用constructor()创建一个有效对象。// 由于没有为Point定义构造函数,编译器将自动添加一个默认构造函数。
}function getPoint(o: Point): Point {return o;
}// 字面量初始化需要显式定义类型
let p: Point = {x: 5, y: 10};
getPoint(p);// getPoint接受Point类型,字面量初始化生成一个Point的新实例
getPoint({x: 5, y: 10});

相关约束
对象字面量不能用于类型声明
数组字面量必须仅包含可推断类型的元素
三、对象字面量不能用于类型声明
规则:arkts-no-obj-literals-as-types
级别:错误
ArkTS不支持使用对象字面量声明类型,可以使用类或者接口声明类型。
TypeScript

let o: {x: number, y: number} = {x: 2,y: 3
}type S = Set<{x: number, y: number}>

ArkTS

class O {x: number = 0y: number = 0
}let o: O = {x: 2, y: 3};type S = Set<O>

相关约束
对象字面量必须对应某些显式声明的类或接口
数组字面量必须仅包含可推断类型的元素

本文根据HarmonyOS NEXT Developer Beta1官方公开的开发文档整理而成。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【React】useState:状态管理的基石
  • 【BUG】已解决:ERROR: No matching distribution found for PIL
  • 《GPT-4o mini:开启开发与创新的新纪元》
  • Python酷库之旅-第三方库Pandas(050)
  • 数据传输安全--SSL VPN
  • 音视频入门基础:PCM专题(3)——使用Audacity工具分析PCM音频文件
  • 微信小程序 async-validator 表单验证 第三方包
  • MySQL第一阶段:多表查询、事务
  • 系留无人机在技术上有哪些优势或创新点
  • 华为高教校园网络解决方案 方案规划
  • Elasticsearch 基础
  • 关于线性代数(考研)
  • 挑战房市预测领头羊:KNN vs. 决策树 vs. 线性回归
  • 全栈嵌入式C++、STM32、Modbus、FreeRTOS和MQTT协议:工业物联网(IIoT)可视化系统设计思路(附部分代码解析)
  • 太美了!智能汽车触摸屏中控让驾驶员和乘客目不转睛
  • gcc介绍及安装
  • javascript从右向左截取指定位数字符的3种方法
  • js中forEach回调同异步问题
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Redis字符串类型内部编码剖析
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 从0实现一个tiny react(三)生命周期
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 一起参Ember.js讨论、问答社区。
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​香农与信息论三大定律
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • #if和#ifdef区别
  • (8)STL算法之替换
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (python)数据结构---字典
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (八十八)VFL语言初步 - 实现布局
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (一)Linux+Windows下安装ffmpeg
  • (转)用.Net的File控件上传文件的解决方案
  • .libPaths()设置包加载目录
  • .net dataexcel winform控件 更新 日志
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET IoC 容器(三)Autofac
  • .Net IOC框架入门之一 Unity
  • .Net的DataSet直接与SQL2005交互
  • .NET开源快速、强大、免费的电子表格组件
  • .Net面试题4
  • @Autowired标签与 @Resource标签 的区别
  • @ConfigurationProperties注解对数据的自动封装
  • @ohos.systemParameterEnhance系统参数接口调用:控制设备硬件(执行shell命令方式)
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory