大家好,我是石小石
!经过前几节的教程,相信你已经对鸿蒙的开发、ArkTS
语言、ArkUI
有了一定的认识。这节教程,我们将正式学习ArkTS基础语法,丰富我们的技术栈!
TypeScript与ArkTS的关系
我们先看看官方是怎么介绍的:
简单来说,TypeScript
是一种通用的、基于 JavaScript
的编程语言,主要应用于前端开发中。ArkTS 则是专门为鸿蒙开发生态系统设计的,基于 TypeScript 的一种扩展语言,拥有更强的稳定性和安全性。
ArkTS的基本语法
作为前端,我们上手ArkTS基本语法是非常容易的!首先,ArkTS是兼容TS/JavaScript生态的,我们可以使用TS/JS进行开发或复用已有代码,但是要注意一些约束规则:兼容TS/JS的约束。
当然,都学习ArkTS了,还使用js就太丢人了,我们来快速入门ArkTS的基本语法吧!
基础语法
类型声明
变量声明
let a: string = '你好,我是石小石';
// 更改值
a = '溜了溜了,学个毛线';
常量声明
以关键字const开头的声明引入只读常量,不能修改。
const b: string = '卷不动了!不学了';
// 改值会报错
b = "我好难" // 报错
类型
类型名称 | 描述 | 示例值 |
---|---|---|
Number类型 | 表示整数和浮点数,支持十进制、二进制、八进制和十六进制的字面量。 | let num: number = 3.14; |
Boolean类型 | 逻辑类型,包含 true 和 false 两个值。 |
let isDone: boolean = false; |
String类型 | 表示字符序列,可以使用单引号、双引号或反引号(模板字面量)括起来。 | let greeting: string = "Hello"; |
Void类型 | 指定函数没有返回值。只有一个值 void 。 |
function log(): void {} |
Object类型 | 所有引用类型的基类型。 | let obj: Object = { key: "value" }; |
Array类型 | 表示由同类型元素组成的集合。 | let arr: number[] = [1, 2, 3]; |
Enum类型 | 枚举类型,定义一组命名值。 | enum Color { Red, Green, Blue } let c: Color = Color.Red; |
Union类型 | 联合类型,由多个类型组成,变量可以是这些类型之一。 | `type ID = string |
Aliases类型 | 为匿名类型或已有类型提供别名。 | type Point = { x: number, y: number }; let p: Point = { x: 10, y: 20 }; |
运算符
比较运算符
运算符 | 说明 |
---|---|
=== | 如果两个操作数严格相等(不同类型的操作数是不相等的),则返回true。 |
!== | 如果两个操作数严格不相等(不同类型的操作数是不相等的),则返回true。 |
== | 如果两个操作数相等(尝试先转换不同类型的操作数,再进行比较),则返回true。 |
!= | 如果两个操作数不相等(尝试先转换不同类型的操作数,再进行比较),则返回true。 |
> | 如果左操作数大于右操作数,则返回true。 |
>= | 如果左操作数大于或等于右操作数,则返回true。 |
< | 如果左操作数小于右操作数,则返回true。 |
<= | 如果左操作数小于或等于右操作数,则返回true。 |
算术运算符
运算符 | 说明 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
% | 除法后余数 |
逻辑运算符
运算符 | 说明 | ||
---|---|---|---|
a && b | 逻辑与 | ||
a | b | 逻辑或 | |
! a | 逻辑非 |
常用语句
If语句
const study:boolen = fasle
const work:boolen = fasle
if (study) {
// ...
} else if (work) {
// ...
} else {
// ...
}
Switch语句
const expression:string = "game"
switch (expression) {
case "study":
// 学习鸿蒙
// ...
break; // 可省略
case "work":
case "game":
// 打游戏逻辑
// ...
break; // 可省略
default:
// 默认语句
}
三元运算符
let money:number = 0
let work = money < 10 ? true : false;
for语句
let sum = 0;
for (let i = 0; i < 10; i += 2) {
sum += i;
}
For-of语句、While语句、Do-while、Try语句这些和前端一样,就不一一介绍了!
函数
ArKts的函数语法同样和Ts是几乎一致的
- 函数声明
function add(x: string, y: string): string {
// 支持js的模板字符串
return `${x}${y}`;
}
- 可选参数
function getName(name?: string) {
if (name == undefined) {
console.log('我槽!居然没名字');
} else {
console.log(`大家好, ${
name}!`);
}
}
- 返回类型
// 显式指定返回类型
function game(): string {
return '打游戏'; }
// 推断返回类型为string
function study() {
return '学习鸿蒙'; }
- 箭头函数
let sum = (x: number, y: number): number => {
return x + y;
}
// 省略写法
let sum = (x: number, y: number): number => x + y
- 函数重载
函数重载是java才具备的能力,然后Arkts也是支持的,这一点非常舒服。
我们只需要为同一个函数写入多个同名但签名不同的函数头,函数实现紧随其后就可以实现函数重载效果
// 定义函数重载
function add(a: number, b: number): number;
function add(a: string, b: string): string;
function add(a: any, b: any): any {
return a + b;
}
// 使用函数重载
let sum = add(5, 10); // 调用第一个重载函数,返回数值 15
let concatenated = add("Hello, ", "World!"); // 调用第二个重载函数,返回字符串 "Hello, World!"
console.log(sum); // 输出: 15
console.log(concatenated); // 输出: Hello, World!
类
- 类的基本定义
与 TypeScript 类似,ArkTS 中使用 class 关键字定义类。类可以包含构造函数、属性和方法。
class Person {
name: string;
constructor(name: string) {
this.name = name;
}
greet(): string {
return `Hello, ${
this.name}`;
}
}
- 构造函数与属性初始化
ArkTS 和 TypeScript 一样,支持在构造函数中初始化类的属性。
class Worker {
name: string;
constructor(name: string) {
this.name = name;
}
}
- 访问修饰符
ArkTS 与 TypeScript 相同,支持 public
、private
、protected
修饰符。
class Car {
private model: string;
public year: number;
constructor(model: string, year: number) {
this.model = model;
this.year = year;
}
}
- 方法的声明与实现
与 TypeScript 类似,ArkTS 支持类方法的声明和实现,方法可以有返回类型和参数类型。
class Calculator {
add(a: number, b: number): number {
return a + b;
}
}
- 接口实现
ArkTS 和 TypeScript 一样,支持类实现接口(implements
关键字),但 ArkTS 的接口实现可能会结合 OpenHarmony 的特性,特别是在设备驱动、硬件接口方面的扩展。
interface Movable {
move(): void;
}
class HJ implements Movable {
move(): void {
console.log("脖子右拧~");
}
}
- 静态属性与方法
ArkTS 与 TypeScript 一样支持静态属性和方法
class Version {
static version: string = "1.0.0";
static logVersion(): void {
console.log(this.version);
}
}
- 泛型类
与 TypeScript 类似,ArkTS 支持泛型类,可以创建更灵活和可重用的类结构。
class Box<T> {
content: T;
constructor(content: T) {
this.content = content;
}
}
空安全
ArkTS中的所有类型都是不可为空的,因此类型的值不能为空。
let x: number = null; // 编译时错误
let y: string = null; // 编译时错误
let z: number[] = null; // 编译时错误
我们可以为空值的变量定义为联合类型T | null。
let x: number | null = null;
x = 1; // ok
x = null; // ok
if (x != null) {
// 。。。。
}
这部分我们简单了解一下即可。
模块机制
ArkTS 模块系统在设计上与 JavaScript(特别是 ES6+ 的模块系统)非常相似,但由于 ArkTS 的特定应用场景和其面向 OpenHarmony 的优化,模块导入机制存在些许不同。
- 基础模块导入语法
// 导出模块
export const PI = 3.14;
export function calculateArea(radius: number): number {
return PI * radius * radius;
}
// 导入模块
import {
PI, calculateArea } from './math';
console.log(calculateArea(5));
- 默认导出与命名导出
// 默认导出
export default class Person {
constructor(public name: string) {
}
}
// 导入
import Person from './person';
- 动态导入
async function hhhhh() {
let n = await import('./say');
// 。。。。。
}
动态import的业务场景和使用实例我们可以详细参考官方api:动态import
- 导入HarmonyOS SDK的开放能力
import UIAbility from '@ohos.app.ability.UIAbility';
ohos.app.ability.UIAbility类似于第三方npm包
当然,它的导入方式也是可以很灵活的
方式一:导入Kit下单个模块的接口能力。例如:
import {
UIAbility } from '@kit.AbilityKit';
方式二:导入Kit下多个模块的接口能力。例如:
import {
UIAbility, Ability, Context } from '@kit.AbilityKit';
方式三:导入Kit包含的所有模块的接口能力。例如:
import * as module from '@kit.AbilityKit';
从TypeScript快速切换到ArkTS
ArkTS保持了TypeScript基的本语法风格,使得我们可以直接使用TS进行原生应用的开发,但是,为了程序的稳定与安全,官方还是建议我们将将TS代码适配为ArkTS代码。也就是说,如果你的项目使用TS或者你习惯了写TS,最好都了解一些适配规则,方便快速的技术语言切换。
为啥要适配
我们前端的吃饭语言js是一种弱语言,没啥类型限制,因此我们可以非常快速地编写代码。但正因为没啥限制,可能在开发阶段就产生无法预料的bug,比如取值为undefined造成系统崩溃啥的。
也正因如此,TypeScript崛起了,但是它也有一些局限。比如,它不强制要求对变量进行类型标注,导致很多编译时检查无法开展。所以,官方建议适配。
适配规则
这并不是本文要详细学习的内容,大家感兴趣了可以自己看官方api学习。
总结
ArkTS 是基于 TypeScript 的扩展语言,因此在基础语法表现方面也和TypeScript几乎是一致的,这让前端几乎没有额外的学习成本。但是要注意的是,ArkTS并不是TypeScript,它内部有一系列针对鸿蒙生态的优化。再者,结合ArkUI,它的写法和TS也还是有一些差异的,但是整体学习起来还是非常轻松的。