【成长纪实】Dart 与 ArkTS 函数与类的对比学习:从 Flutter 到 HarmonyOS - 实践
Dart 和 ArkTS 都是现代、响应式的语言,分别作为 Flutter 和 HarmonyOS 应用开发的核心。它们在语法上颇有相似之处(都受到 C++、Java、JavaScript/TypeScript 家族的影响),但在设计哲学和具体实现上又各有侧重。理解它们在函数和类上的差异,是高效进行跨平台学习的关键。
一、 函数对比
1. 基本函数定义
Dart: 类型注解是可选的,但推荐使用。返回值类型、参数类型都可以省略(此时为
dynamic)。dart
// Dart int add(int a, int b) { return a + b; } // 类型省略版本 (不推荐在生产环境使用) add(a, b) { return a + b; }ArkTS: 作为 TypeScript 的超集,类型是强制的。这提供了更好的静态检查和开发体验。
typescript
// ArkTS add(a: number, b: number): number { return a + b; }
2. 箭头函数 (Lambda/匿名函数)
Dart: 对于只有一个表达式的函数,可以使用箭头语法
=>。它隐含了return。dart
// Dart int add(int a, int b) => a + b; var list = [1, 2, 3]; var doubled = list.map((e) => e * 2).toList();ArkTS: 同样支持箭头函数,语法与 JavaScript/TS 一致。
typescript
// ArkTS const add = (a: number, b: number): number => a + b; let list: number[] = [1, 2, 3]; let doubled = list.map((e: number) => e * 2);
3. 参数类型
可选参数与默认参数:
Dart: 提供了两种可选参数机制。
命名可选参数: 使用
{}包裹,调用时使用paramName: value的形式。dart
// Dart void introduce({String name = '匿名', int age = 0}) { print('我是$name, 今年$age岁。'); } introduce(name: '张三', age: 20); // 调用 introduce(age: 25); // 调用位置可选参数: 使用
[]包裹,按顺序传递。dart
// Dart void introduce(String name, [int age = 0]) { print('我是$name, 今年$age岁。'); } introduce('李四', 30); // 调用 introduce('王五'); // 调用
ArkTS: 语法更接近 TypeScript,使用
?标识可选参数,并可直接在参数列表中赋默认值。typescript
// ArkTS introduce(name: string = '匿名', age?: number): void { console.log(`我是${name}, 今年${age}岁。`); } introduce('张三', 20); // 调用 introduce('李四'); // 调用,age 为 undefined
4. 异步函数
Dart: 使用
async/await关键字。异步函数返回Future<T>类型。dart
// Dart FuturefetchUserData() async { // 模拟网络请求 await Future.delayed(Duration(seconds: 1)); return 42; } void main() async { var data = await fetchUserData(); print(data); // 输出: 42 } ArkTS: 同样使用
async/await,但返回类型是Promise<T>。typescript
// ArkTS async fetchUserData(): Promise{ // 模拟网络请求 await new Promise(resolve => setTimeout(resolve, 1000)); return 42; } async function main() { let data = await fetchUserData(); console.log(data); // 输出: 42 }
二、 类对比
1. 基本类定义与构造函数
Dart: 构造函数可以有多种形式。
this.语法用于简化参数赋值。dart
// Dart class Person { String name; int age; // 标准构造函数 Person(this.name, this.age); // 命名构造函数 Person.newBorn() { name = '新生儿'; age = 0; } // 方法 void introduce() { print('我是$name, 今年$age岁。'); } }ArkTS: 使用
constructor关键字定义构造函数。属性通常在构造函数参数中直接声明。typescript
// ArkTS class Person { name: string; age: number; // 构造函数 constructor(name: string, age: number) { this.name = name; this.age = age; } // 方法 introduce(): void { console.log(`我是${this.name}, 今年${this.age}岁。`); } }
2. 继承
Dart: 使用
extends继承,使用super调用父类构造函数和方法。dart
// Dart class Student extends Person { String major; Student(String name, int age, this.major) : super(name, age); @override void introduce() { super.introduce(); // 调用父类方法 print('我的专业是$major。'); } }ArkTS: 同样使用
extends和super。typescript
// ArkTS class Student extends Person { major: string; constructor(name: string, age: number, major: string) { super(name, age); // 必须首先调用 super this.major = major; } override introduce(): void { super.introduce(); // 调用父类方法 console.log(`我的专业是${this.major}。`); } }
3. 访问控制符 (封装)
Dart: 没有
public,private,protected关键字。默认都是公共的。以一个下划线_开头的标识符是库私有的。dart
// Dart class BankAccount { String _privateData; // 库内可见 String publicData; // 到处可见 void _privateMethod() {} // 库内可见 }ArkTS: 提供了标准的访问控制符,与 Java/C# 类似。
public(默认): 公有。private: 私有,以#开头 或 使用private关键字(具体取决于TS配置,HarmonyOS推荐使用private)。protected: 受保护,子类和自身可访问。
typescript
// ArkTS class BankAccount { private balance: number = 0; // 私有属性 public owner: string; // 公有属性 public deposit(amount: number): void { this.balance += amount; // 类内部可以访问私有属性 } public getBalance(): number { return this.balance; } }
4. 计算属性
Dart: 使用
get关键字定义计算属性。dart
// Dart class Rectangle { double width, height; Rectangle(this.width, this.height); // 计算属性 area double get area => width * height; set area(double value) { // 也可以有 setter width = value / height; } }ArkTS: 使用
get关键字,语法略有不同。typescript
// ArkTS class Rectangle { width: number; height: number; constructor(width: number, height: number) { this.width = width; this.height = height; } // 计算属性 area get area(): number { return this.width * this.height; } }
三、 总结与核心差异表
| 特性 | Dart | ArkTS | 核心差异 |
|---|---|---|---|
| 函数类型 | 可选,动态类型 | 强制,静态类型 | ArkTS 的类型系统更严格,旨在减少运行时错误。 |
| 可选参数 | 命名参数 {},位置参数 [] | 使用 ? 和默认值 | 语法风格不同,Dart 的命名参数在调用时更清晰。 |
| 异步返回 | Future<T> | Promise<T> | 概念完全相同,只是类型名称不同。 |
| 构造函数 | 与类同名,this. 语法糖 | constructor 关键字 | Dart 的语法更简洁。 |
| 访问控制 | 下划线 _ 前缀表示库私有 | public, private, protected 关键字 | ArkTS 提供了更传统和精细的访问控制。 |
| 空安全 | 默认开启,非空类型需初始化 | 继承 TypeScript 的严格空检查 | 两者都致力于在编译时消除空引用错误。 |
| 设计哲学 | 为 Flutter 的 UI-as-Code 优化,灵活 | 为大型应用和系统级开发优化,严谨 | Dart 偏向灵活性和开发效率,ArkTS 偏向工程化和运行时安全。 |
学习建议:
从 Dart 到 ArkTS: 你需要重点适应强制的类型注解、传统的访问控制符以及
constructor关键字。忘掉 Dart 的_私有方式。从 ArkTS 到 Dart: 你会感受到更自由的语法(类型可选),并学习 Dart 特有的命名构造函数和
_私有规则。注意Future和Promise的转换。
希望这篇对比能帮助你在 Dart 和 ArkTS 的世界里自如切换,更好地驾驭 Flutter 和 HarmonyOS 应用开发!

浙公网安备 33010602011771号