跳到主要内容
鸿蒙 ArkTS 开发入门:从 TypeScript 迁移指南 | 极客日志
TypeScript 大前端
鸿蒙 ArkTS 开发入门:从 TypeScript 迁移指南 综述由AI生成 从 TypeScript 迁移至鸿蒙 ArkTS 的核心差异与规范。内容涵盖 ArkTS 静态类型检查优势、编译期错误预防及性能优化原理,列举了 10 条关键迁移规则(如禁用 var/any、强制属性初始化、使用箭头函数等),并提供版本兼容性说明与实战案例对比。旨在帮助开发者快速适应 ArkTS 严格规范,提升代码稳定性与运行效率。
栈溢出 发布于 2026/3/24 更新于 2026/5/1 6.3K 浏览鸿蒙 ArkTS 开发入门:从 TypeScript 迁移指南
ArkTS = TypeScript - 动态特性 + 更严格的静态检查
就这么简单。ArkTS 保留了 TS 的大部分语法,但砍掉了一些影响性能和稳定性的动态特性,同时加强了编译时的类型检查。这么做的目的是什么?
程序更稳定 :运行时少报错
性能更好 :减少运行时的类型检查
代码更清晰 :类型一目了然
说白了,就是用开发时的'麻烦'换运行时的'顺畅' 。
为什么要从 TS 迁移到 ArkTS?
一部分是像我这种前端开发,编程习惯导致很多时候肌肉记忆写出来的代码在鸿蒙编译不通过。
另外在工程化上,我们有很多 web 三方的 utils 库是非常经典的,在造轮子的过程中,不可避免的会从一个范式到另一个范式的迁移过渡。
2.1 程序稳定性:把错误扼杀在编译阶段
动态类型语言(比如 JavaScript)虽然开发爽,但运行时容易翻车。最典型的就是undefined 错误 :
class Person {
name : string ;
getName (): string {
return this .name ;
}
}
let buddy = new Person ();
buddy.getName ().length ;
这个问题在 TS 里可能被忽略,但在 ArkTS 里根本编译不过 :
// ArkTS
class Person {
name: string = ''; // 必须显式初始化
getName(): string {
return this.name; // 现在保证是 string,不会是 undefined
}
}
let buddy = new Person();
buddy.getName().length; // 0,安全运行
如果 name 真的可能为空,那就得明确写出来:
class Person {
name?: string; // 可能为 undefined
getName(): string | undefined {
// 返回类型也要匹配
return this.name;
}
}
buddy.getName()?.length; // 必须用可选链,否则编译报错
2.2 程序性能:减少运行时的类型检查
JavaScript 引擎为了处理动态类型,需要在运行时做大量检查。比如这个简单的函数:
function notify ( ) {
. ( );
}
who: string, what: string
console
info
`Dear ${who} , a message for you: ${what} `
在 JS 里,如果有人调用 notify(null, undefined),引擎就得做类似这样的检查:
function __internal_tostring (s ) {
if (typeof s === 'string' ) return s;
if (s === undefined ) return 'undefined' ;
if (s === null ) return 'null' ;
}
ArkTS 通过强制静态类型,保证运行时不会出现非 string 类型的值 ,这些检查就可以省略,性能自然就上去了。
迁移核心:从'能用'到'规范'
3.1 最需要改的 10 条规则(新手必看) 下面是我总结的、迁移中最常遇到的 10 条规则,看完就能上手改代码。
规则 1:使用 let,别用 var(arkts-no-var)
规则 2:别用 any 和 unknown(arkts-no-any-unknown) let value : any = 'hello' ;
value = 42 ;
let value : string = 'hello' ;
let value2 : string | number = 'hello' ;
value2 = 42 ;
规则 3:类的属性必须初始化(编译强制) class Person {
name : string ;
age : number ;
}
class Person {
name : string = '' ;
age : number = 0 ;
constructor (name : string , age : number ) {
this .name = name;
this .age = age;
}
}
规则 4:构造函数里不能声明字段(arkts-no-ctor-prop-decls) class Person {
constructor (
private name : string ,
public age : number
) {}
}
class Person {
private name : string ;
public age : number ;
constructor (name : string , age : number ) {
this .name = name;
this .age = age;
}
}
规则 5:用箭头函数,别用函数表达式(arkts-no-func-expressions) let f = function (s : string ) {
console .info (s);
};
let f = (s : string ) => {
console .info (s);
};
规则 6:用点访问属性,别用方括号(arkts-no-props-by-index) let obj = { name : 'John' };
console .info (obj['name' ]);
let obj = { name : 'John' };
console .info (obj.name );
规则 7:类型转换用 as,别用尖括号(arkts-as-casts) let value = <string >someVar;
let value = someVar as string ;
规则 8:别用解构赋值(arkts-no-destruct-assignment) let [a, b] = [1 , 2 ];
[a, b] = [b, a];
let arr = [1 , 2 ];
let a = arr[0 ];
let b = arr[1 ];
let tmp = a;
a = b;
b = tmp;
规则 9:别用 for…in,用普通 for 循环(arkts-no-for-in) let arr = ['a' , 'b' , 'c' ];
for (let i in arr) {
console .info (arr[i]);
}
let arr = ['a' , 'b' , 'c' ];
for (let i = 0 ; i < arr.length ; i++) {
console .info (arr[i]);
}
for (let item of arr) {
console .info (item);
}
规则 10:throw 只能抛 Error 对象(arkts-limited-throw)
进阶迁移:这些特性 ArkTS 不支持
4.1 不支持动态修改对象 在 ArkTS 里,对象的布局是固定的 ,不能在运行时添加或删除属性。
class Point {
x: number = 0;
y: number = 0;
}
let p = new Point();
// 以下操作都不允许
delete p.x; // 编译错误
p.z = 10; // 编译错误
(p as any).z = 10; // 编译错误(不能用 any 绕过)
怎么改 :在设计类的时候就把所有可能的属性都定义好。
4.2 不支持 structural typing 在 TS 里,只要两个类结构一样,就可以互相赋值:
class T {
name : string = '' ;
greet ( ) {
console .info ('Hello' );
}
}
class U {
name : string = '' ;
greet ( ) {
console .info ('Greetings' );
}
}
let u : U = new T ();
ArkTS 不支持这个,必须通过继承 或实现接口 来建立关系:
// ArkTS
interface Greetable {
name: string;
greet(): void;
}
class T implements Greetable {
name: string = '';
greet() {
console.info('Hello');
}
}
class U implements Greetable {
name: string = '';
greet() {
console.info('Greetings');
}
}
let u: Greetable = new T(); // 合法,都实现了相同接口
4.3 不支持运算符重载 ArkTS 对一元运算符有严格限制,只能用于数值类型:
let a = +5 ;
let b = +'5' ;
let c = -'5' ;
let d = Number ('5' );
4.4 不支持解构声明
let { x, y } = point;
let x = point.x ;
let y = point.y ;
迁移实战:一个真实案例 假设我们有一个 TS 写的工具类,看看怎么迁移到 ArkTS。
TS 原版代码
class Logger {
level : string ;
constructor (level ?: string ) {
if (level) {
this .level = level;
}
}
log (message : string ) {
console [this .level ](message);
}
}
let logger = new Logger ();
logger.log ('hello' );
ArkTS 迁移后 // utils.ets
class Logger {
level: string = 'log'; // 给个默认值
constructor(level?: string) {
if (level) {
this.level = level;
}
}
log(message: string) {
// 安全访问
if (this.level) {
console[this.level](message);
} else {
console.log(message);
}
}
}
// 使用
let logger = new Logger();
logger.log('hello'); // 安全运行
兼容性说明:版本差异要注意
6.1 根据 SDK 版本的不同 compatibleSdkVersion 模式 行为 >= 10 标准模式 必须严格遵循 ArkTS 语法,否则编译失败 < 10 兼容模式 违反规则只给警告,仍可编译成功
6.2 文件引用规则
✅ .ets文件可以 import .ets/.ts/.js文件
❌ .ts/.js文件不能 import .ets文件
这意味着核心逻辑最好写在.ets文件里 ,避免循环依赖。
迁移清单:照着这个改就行
必改项(编译错误)
把 var改成let
去掉所有 any和unknown
类的属性必须初始化
构造函数参数里不能声明字段
函数表达式改成箭头函数
属性访问用点,别用方括号
类型转换用 as,别用尖括号
去掉解构赋值
for...in改成for循环或for...of
throw只能抛Error对象
建议改(警告)
不要用 Function.bind/call/apply
不要用 globalThis
不要用 as const
不要用 @ts-ignore(ArkTS 里直接报错)
总结:一张表记住 TS 和 ArkTS 的核心差异 特性 TypeScript ArkTS 迁移建议 类型系统 渐进式 强制静态 所有变量都要有明确类型 any类型支持 ❌ 不支持 用具体类型或联合类型替代 属性初始化 可选 必须 声明时就初始化或在构造函数里初始化 解构赋值 支持 ❌ 不支持 拆开写 for...in支持 ❌ 不支持 用 for或for...of 对象动态属性 支持 ❌ 不支持 类里预先定义好所有属性 throw类型任意 只能是 Error throw new Error()this使用任意位置 仅限于实例方法 静态方法和函数里不能用 this 文件引用 任意 .ets不能被子.ts 引用核心逻辑写在 .ets
相关免费在线工具 Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
HTML转Markdown 将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
JSON 压缩 通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
JSON美化和格式化 将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online