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

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

一、强制使用静态类型
静态类型是ArkTS最重要的特性之一。如果程序采用静态类型,即所有类型在编译时都是已知的,那么开发者就能够容易理解代码中使用了哪些数据结构。同时,由于所有类型在程序实际运行前都是已知的,编译器可以提前验证代码的正确性,从而可以减少运行时的类型检查,有助于提升性能。
基于上述考虑,ArkTS中禁止使用any类型。
示例

// 不支持:
let res: any = some_api_function('hello', 'world');
// `res`是什么?错误代码的数字?字符串?对象?
// 该如何处理它?
// 支持:
class CallResult {public succeeded(): boolean { ... }public errorMessage(): string { ... }
}let res: CallResult = some_api_function('hello', 'world');
if (!res.succeeded()) {console.log('Call failed: ' + res.errorMessage());
}

any类型在TypeScript中并不常见,只有大约1%的TypeScript代码库使用。一些代码检查工具(例如ESLint)也制定一系列规则来禁止使用any。因此,虽然禁止any将导致代码重构,但重构量很小,有助于整体性能提升。
二、禁止在运行时变更对象布局
为实现最佳性能,ArkTS要求在程序执行期间不能更改对象的布局。换句话说,ArkTS禁止以下行为:
向对象中添加新的属性或方法。
从对象中删除已有的属性或方法。
将任意类型的值赋值给对象属性。
TypeScript编译器已经禁止了许多此类操作。然而,有些操作还是有可能绕过编译器的,例如,使用as any转换对象的类型,或者在编译TS代码时关闭严格类型检查的配置,或者在代码中通过@ts-ignore忽略类型检查。
在ArkTS中,严格类型检查不是可配置项。ArkTS强制进行部分严格类型检查,并通过规范禁止使用any类型,禁止在代码中使用@ts-ignore。
示例

class Point {public x: number = 0public y: number = 0constructor(x: number, y: number) {this.x = x;this.y = y;}
}// 无法从对象中删除某个属性,从而确保所有Point对象都具有属性x
let p1 = new Point(1.0, 1.0);
delete p1.x;           // 在TypeScript和ArkTS中,都会产生编译时错误
delete (p1 as any).x;  // 在TypeScript中不会报错;在ArkTS中会产生编译时错误// Point类没有定义命名为z的属性,在程序运行时也无法添加该属性
let p2 = new Point(2.0, 2.0);
p2.z = 'Label';           // 在TypeScript和ArkTS中,都会产生编译时错误
(p2 as any).z = 'Label';   // 在TypeScript中不会报错;在ArkTS中会产生编译时错误// 类的定义确保了所有Point对象只有属性x和y,并且无法被添加其他属性
let p3 = new Point(3.0, 3.0);
let prop = Symbol();      // 在TypeScript中不会报错;在ArkTS中会产生编译时错误
(p3 as any)[prop] = p3.x; // 在TypeScript中不会报错;在ArkTS中会产生编译时错误
p3[prop] = p3.x;          // 在TypeScript和ArkTS中,都会产生编译时错误// 类的定义确保了所有Point对象的属性x和y都具有number类型,因此,无法将其他类型的值赋值给它们
let p4 = new Point(4.0, 4.0);
p4.x = 'Hello!';          // 在TypeScript和ArkTS中,都会产生编译时错误
(p4 as any).x = 'Hello!'; // 在TypeScript中不会报错;在ArkTS中会产生编译时错误// 使用符合类定义的Point对象:
function distance(p1: Point, p2: Point): number {return Math.sqrt((p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y));
}
let p5 = new Point(5.0, 5.0);
let p6 = new Point(6.0, 6.0);
console.log('Distance between p5 and p6: ' + distance(p5, p6));

修改对象布局会影响代码的可读性以及运行时性能。从开发者的角度来说,在某处定义类,然后又在其他地方修改实际的对象布局,很容易引起困惑乃至引入错误。此外,这点还需要额外的运行时支持,增加了执行开销。这一点与静态类型的约束也冲突:既然已决定使用显式类型,为什么还需要添加或删除属性呢?
当前,只有少数项目允许在运行时变更对象布局,一些常用的代码检查工具也增加了相应的限制规则。这个约束只会导致少量代码重构,但会提升性能。

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

相关文章:

  • macOS Sequoia 15 beta 2 (24A5279h) Boot ISO 原版可引导镜像下载 (iPhone Mirroring 现已支持)
  • React Native优质开源项目推荐与解析
  • grpc学习golang版( 三、proto文件数据类型 )
  • 非常疑惑文章变成了仅VIP可读
  • 【高考志愿】建筑学
  • 深圳信息职业技术学院联合开源网安,培育新一代复合型网安人才
  • 高阶面试-spring的部分
  • Android Style 使用指南
  • 汽车电子行业知识:什么是车载智能座舱
  • Spring Boot配置文件properties/yml/yaml
  • Pytest+Allure+Yaml+PyMsql+Jenkins+Gitlab接口自动化(四)Jenkins配置
  • 【Arduino】XIAOFEIYU实验ESP32实验热敏电阻(图文)
  • 23- Redis 主从复制是怎么实现的?
  • 【ai】ubuntu18.04 找不到 nvcc --version问题
  • pdf文档翻译有哪些好的推荐
  • ES6之路之模块详解
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • javascript数组去重/查找/插入/删除
  • Mysql5.6主从复制
  • Swoft 源码剖析 - 代码自动更新机制
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 开源SQL-on-Hadoop系统一览
  • 让你的分享飞起来——极光推出社会化分享组件
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 一个SAP顾问在美国的这些年
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • raise 与 raise ... from 的区别
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 昨天1024程序员节,我故意写了个死循环~
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #define与typedef区别
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (007)XHTML文档之标题——h1~h6
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • **python多态
  • ./configure,make,make install的作用(转)
  • .form文件_SSM框架文件上传篇
  • .NET 指南:抽象化实现的基类
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET之C#编程:懒汉模式的终结,单例模式的正确打开方式
  • .net中我喜欢的两种验证码
  • [ C++ ] 类和对象( 下 )
  • []串口通信 零星笔记
  • [20171106]配置客户端连接注意.txt
  • [8] CUDA之向量点乘和矩阵乘法
  • [BZOJ1053][HAOI2007]反素数ant
  • [C#基础知识]专题十三:全面解析对象集合初始化器、匿名类型和隐式类型
  • [C++] vector list 等容器的迭代器失效问题
  • [C++提高编程](三):STL初识
  • [DevEpxress]GridControl 显示Gif动画