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

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严格区分intdouble,而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 };

总结

特性DartArkTS
数字类型区分intdouble统一number类型
字符串插值$variable${expression}
数组/列表List<T>T[] 或 Array<T>
元组支持不支持支持[T1, T2, T3]
对象结构Map或类定义接口interface定义
空安全T?!操作符T | null!操作符
动态类型dynamicany和更安全的unknown
类型别名typedeftype关键字
枚举增强支持带字段的枚举支持字符串枚举

两种语言在数据类型设计上都体现了现代语言的特性,但ArkTS基于TypeScript,更强调静态类型安全和与JavaScript生态的兼容性,而Dart作为Flutter的专属语言,更注重开发效率和运行时性能的平衡

https://developer.huawei.com/consumer/cn/training/classDetail/fd34ff9286174e848d34cde7f512ce22?type=1%3Fha_source%3Dhmosclass&ha_sourceId=89000248

http://www.dtcms.com/a/498707.html

相关文章:

  • 【11408学习记录】考研数学核心突破:线性变换的深度解析与应用实例
  • PHP8.5 的新 URI 扩展
  • 基于单片机的 220v车载逆变电源的设计与制作(论文+图纸)
  • 网站建设定制设计南京企业网站开发
  • python|运算符
  • 基于精准营养与数字表型的糖尿病生活方式干预新范式
  • 基于开源AI大模型、AI智能名片与S2B2C商城小程序的购物中心精准零售数据架构研究
  • 深度学习进阶(八)——AI 操作系统的雏形:AgentOS、Devin 与多智能体协作
  • 旧物新生,从二手回收小程序开启绿色生活
  • 网站建设模板代理手机购物app排行榜前十名
  • openharmony之分布式购物车开发实战
  • 音乐网站建设的意义全媒体运营技巧和工具
  • 关于最简单的机器学习的梯度下降公式的求导过程
  • 【AI】一文说清楚神经网络、机器学习、专家系统
  • C语言数据结构:算法复杂度(2)
  • MySQL————索引
  • 建设网站具体步骤电子报 网站开发
  • 站外引流推广渠道专业的高密网站建设
  • (Kotlin高级特性二)kotlin内联函数(inline)的作用?为什么noinline和crossinline?
  • 网站关键词在哪里看做网站工作量怎么算
  • PostgreSQL 自动化脚本安装方案
  • 济南网络公司建站网站开发属于什么费用
  • IoT 系统中的 Saga 应用模式及其设计要点
  • WebServer类
  • 吃透 C++ 栈和队列:stack/queue/priority_queue 用法 + 模拟 + STL 标准实现对比
  • 重庆网站模版建设青岛做网站的公司排名
  • 圆桌讨论:Coding Agent or AI IDE 的现状和未来发展
  • 相机成像中的平行平面成像
  • 并发集合踩坑现场:ConcurrentHashMap size() 阻塞、HashSet 并发 add 丢数据、Queue 伪共享
  • BT之家1LOU站永久地址发布页 - 回归初心,最新官网入口