HarmonyOS中ArkTS与Flutter数据类型对比详解
1. 基础数据类型对比
数字类型 (Numbers)
Dart:
dart
// 整数类型 int age = 25; int hexValue = 0xDEADBEEF;// 浮点数类型 double price = 19.99; double exponent = 1.42e5;// 数值类型自动推断 var number = 42; // 编译时为 int var decimal = 3.14; // 编译时为 double
ArkTS:
typescript
// 数字类型 (不区分整数和浮点数) let age: number = 25; let price: number = 19.99; let hexValue: number = 0xDEADBEEF; let exponent: number = 1.42e5;// 类型推断 let number = 42; // 推断为 number let decimal = 3.14; // 推断为 number
关键区别: Dart严格区分int
和double
,而ArkTS统一使用number
类型。
字符串类型 (Strings)
Dart:
dart
// 字符串定义 String name = 'Alice'; String greeting = "Hello, World!";// 多行字符串 String multiLine = '''这是多行字符串 ''';// 字符串插值 String message = 'Hello, $name! You are ${age + 1} years old next year.';
ArkTS:
typescript
// 字符串定义 let name: string = 'Alice'; let greeting: string = "Hello, World!";// 多行字符串 (使用模板字符串) let multiLine: string = `这是多行字符串 `;// 字符串插值 let message: string = `Hello, ${name}! You are ${age + 1} years old next year.`;
关键区别: 两者都支持字符串插值,但语法不同:Dart使用$variable
,ArkTS使用${expression}
。
布尔类型 (Booleans)
Dart:
dart
bool isActive = true; bool isEmpty = false;// 类型检查 var result = 10 > 5; // 自动推断为 bool
ArkTS:
typescript
let isActive: boolean = true; let isEmpty: boolean = false;// 类型检查 let result: boolean = 10 > 5;
相同点: 两者布尔类型基本一致。
2. 集合数据类型对比
列表/数组 (List/Array)
Dart:
dart
// 列表定义 List<int> numbers = [1, 2, 3, 4, 5]; List<String> names = ['Alice', 'Bob', 'Charlie'];// 动态类型列表 List dynamicList = [1, 'hello', true];// 列表操作 numbers.add(6); names.removeAt(0); print(numbers.length); // 获取长度
ArkTS:
typescript
// 数组定义 let numbers: number[] = [1, 2, 3, 4, 5]; let names: Array<string> = ['Alice', 'Bob', 'Charlie'];// 元组类型 (ArkTS特有) let tuple: [string, number, boolean] = ['Alice', 25, true];// 数组操作 numbers.push(6); names.splice(0, 1); console.log(numbers.length); // 获取长度
关键区别: ArkTS支持元组(Tuple)类型,可以定义固定类型和长度的数组。
映射/对象 (Map/Object)
Dart:
dart
// Map定义 Map<String, dynamic> person = {'name': 'Alice','age': 25,'isStudent': true };// 类型化Map Map<String, int> scores = {'math': 95,'english': 88 };// Map操作 person['city'] = 'Beijing'; print(person['name']);
ArkTS:
typescript
// 对象定义 interface Person {name: string;age: number;isStudent: boolean; }let person: Person = {name: 'Alice',age: 25,isStudent: true };// 索引签名对象 let dynamicObject: { [key: string]: any } = {'name': 'Alice','age': 25 };// 对象操作 dynamicObject['city'] = 'Beijing'; console.log(person.name);
关键区别: ArkTS强调接口(Interface)定义对象结构,提供更好的类型安全。
3. 特殊数据类型对比
空安全处理
Dart:
dart
// 可空类型 String? nullableString = null; int? nullableInt;// 空断言操作符 String name = nullableString!; // 运行时如果为null会抛出异常// 空安全调用 int? length = nullableString?.length;// 空值合并操作符 String displayName = nullableString ?? 'Unknown';
ArkTS:
typescript
// 可空类型 let nullableString: string | null = null; let nullableString2: string | undefined = undefined;// 非空断言操作符 let name: string = nullableString!;// 可选链操作符 let length: number | undefined = nullableString?.length;// 空值合并操作符 let displayName: string = nullableString ?? 'Unknown';
枚举类型 (Enums)
Dart:
dart
enum Color { red, green, blue }// 增强枚举 (Dart 2.17+) enum Status {pending('等待中'),approved('已批准'),rejected('已拒绝');final String description;const Status(this.description); }var favoriteColor = Color.blue; print(favoriteColor.index); // 2
ArkTS:
typescript
enum Color {Red,Green,Blue }// 字符串枚举 enum Direction {Up = "UP",Down = "DOWN",Left = "LEFT",Right = "RIGHT" }let favoriteColor: Color = Color.Blue; console.log(favoriteColor); // 2
动态类型与类型推断
Dart:
dart
// dynamic类型 dynamic anything = 'hello'; anything = 42; // 可以重新赋值为不同类型 anything = [1, 2, 3]; // 再次改变类型// var类型推断 var name = 'Alice'; // 推断为 String var count = 42; // 推断为 int// final和const final username = 'Alice'; // 运行时常量 const maxCount = 100; // 编译时常量
ArkTS:
typescript
// any类型 let anything: any = 'hello'; anything = 42; // 可以重新赋值为不同类型 anything = [1, 2, 3]; // 再次改变类型// unknown类型 (比any更安全) let uncertain: unknown = 'hello'; // uncertain.toUpperCase(); // 错误:需要类型检查 if (typeof uncertain === 'string') {console.log(uncertain.toUpperCase()); // 正确 }// 类型推断 let name = 'Alice'; // 推断为 string let count = 42; // 推断为 number// const和readonly const maxCount = 100; // 常量 let readonlyArray: readonly number[] = [1, 2, 3]; // readonlyArray.push(4); // 错误:只读数组
关键区别: ArkTS引入unknown
类型,比any
更安全,需要显式类型检查。
4. 高级类型特性
联合类型与类型别名
Dart:
dart
// 联合类型 (通过继承或mixin实现) abstract class Shape {} class Circle implements Shape {} class Rectangle implements Shape {}// 类型定义别名 typedef IntList = List<int>; typedef StringMapper = String Function(String);IntList numbers = [1, 2, 3]; StringMapper toUpper = (s) => s.toUpperCase();
ArkTS:
typescript
// 联合类型 type ID = number | string; type Status = 'pending' | 'approved' | 'rejected';let userId: ID = 123; userId = 'abc123'; // 允许let currentStatus: Status = 'pending';// 类型别名 type Point = {x: number;y: number; };type StringMapper = (s: string) => string;let position: Point = { x: 10, y: 20 }; let toUpper: StringMapper = (s) => s.toUpperCase();
泛型 (Generics)
Dart:
dart
// 泛型类 class Box<T> {T value;Box(this.value);T getValue() => value; }// 泛型函数 T first<T>(List<T> items) {return items[0]; }var stringBox = Box<String>('hello'); var numberBox = Box<int>(42);
ArkTS:
typescript
// 泛型接口 interface Box<T> {value: T;getValue(): T; }// 泛型函数 function first<T>(items: T[]): T {return items[0]; }// 泛型约束 interface HasLength {length: number; }function logLength<T extends HasLength>(arg: T): void {console.log(arg.length); }let stringBox: Box<string> = { value: 'hello', getValue: () => 'hello' }; let numberBox: Box<number> = { value: 42, getValue: () => 42 };
总结
特性 | Dart | ArkTS |
---|---|---|
数字类型 | 区分int 和double | 统一number 类型 |
字符串插值 | $variable | ${expression} |
数组/列表 | List<T> | T[] 或 Array<T> |
元组支持 | 不支持 | 支持[T1, T2, T3] |
对象结构 | Map 或类定义 | 接口interface 定义 |
空安全 | T? 和! 操作符 | T | null 和! 操作符 |
动态类型 | dynamic | any 和更安全的unknown |
类型别名 | typedef | type 关键字 |
枚举增强 | 支持带字段的枚举 | 支持字符串枚举 |
两种语言在数据类型设计上都体现了现代语言的特性,但ArkTS基于TypeScript,更强调静态类型安全和与JavaScript生态的兼容性,而Dart作为Flutter的专属语言,更注重开发效率和运行时性能的平衡
https://developer.huawei.com/consumer/cn/training/classDetail/fd34ff9286174e848d34cde7f512ce22?type=1%3Fha_source%3Dhmosclass&ha_sourceId=89000248