HarmonyOS编程语言介绍

坚果:润开鸿数字科技有限公司技术专家,华为开发者专家(HUAWEI Developer Experts),OpenHarmony布道师,OpenHarmony校源行开源大使,InfoQ签约作者,CSDN博客专家,51CTO博客专家,阿里云博客专家,电子发烧友社区之星,开发者学堂”十佳“讲师。在“战码先锋”二期活动中作为大队长,累计培养三个小队长,带领100+队员完成Pr的提交合入,自己累计贡献1.5w行代码。

1.编程语言介绍

ArkTS是HarmonyOS优选的主力应用开发语言。它在TypeScript(简称TS)的基础上,匹配ArkUI框架,扩展了声明式UI、状态管理等相应的能力,让开发者以更简洁、更自然的方式开发跨端应用。在本课程中对于ArkTS,TypeScript,JavaScript的关系也做了梳理。

TypeScript是JavaScript的超集,ArkTS则是TypeScript的超集,他们的关系如下图所示:

HarmonyOS编程语言介绍_前端

2. TypeScript快速入门

TypeScript支持一些基础的数据类型,如布尔型、数组、字符串等,

布尔值

TypeScript中可以使用boolean来表示这个变量是布尔值,可以赋值为true或者false。

let isDone: boolean = false;

字符串

TypeScript里使用 string表示文本数据类型, 可以使用双引号( ")或单引号(')表示字符串。

let name: string = "坚果";

数组

TypeScrip有两种方式可以定义数组。 第一种,可以在元素类型后面接上 [],表示由此类型元素组成的一个数组。

let list: number[] = [1, 2, 3];

元组

TypeScript 提供了元组来表示已知元素数量和类型的数组,元组内的各元素的类型不必相同,但是对应位置的类型必须一致。

let user: [string, number, string]; // 定义一个元组
user = ["坚果", 25, '兰州'];

enum

TypeScript 提供了 enum 关键字表示枚举类型,枚举类型主要用于定义数值的集合。

enum Color {               // 定义一个枚举
  Red,
  Green,
  Blue
}
let c: Color = Color.Blue; // 定义枚举类型

Void

TypeScript 提供了 void 关键字表示函数的返回类型为空,也就是函数没有返回值。

function test(): void {
   console.log('This is function is void');
}

undefined

TypeScript 提供了 undefined 关键字表示声明了一个变量但并没有赋值的情况。

let data;

联合类型

TypeScript 允许通过 | 将一个变量设置成多种类型,赋值的时候可以根据设置的类型来赋值。

let data: string | number; // 设置data为联合类型
data = '坚果';      // 正确
data = 25;                 // 正确

3. 条件语句

条件语句用于基于不同的条件来执行不同的动作。TypeScript 条件语句是通过一条或多条语句的执行结果(True 或 False)来决定执行的代码块。

这部分和其他编程语言类似,主要有if 语句if...else 语句if...else if....else 语句switch…case 语句。不做过多学习

4 函数

函数就是包裹在花括号中的代码块,前边使用 function 关键字,语法格式如下:

function function_test() {
  // 执行代码
}

例如声明函数如下:

function log() { // 声明一个函数
  console.log(“坚果”);         // 代码块
}

函数调用

函数只有通过调用才可以执行函数内的代码,语法格式如下:

function_test()

函数返回值

如果希望得到函数的执行结果,可以使用 return 语句,语法如下:

function function_test(): return_type {
    return value; // return语句
}

上面是函数的基础,此外还有

可选参数

语法:

function func_name(param1: paramType, param2?: paramType) {
}

举例:

function buildName(firstName: string, age?: number) {
    if (lastName)
        return firstName + ' ' + lastName;
    else
        return firstName;
}

let result1 = buildName('坚果');
let result2 = buildName('坚果', 25);

剩余参数

剩余参数会被当做个数不限的可选参数。 可以一个都没有,同样也可以有任意个。 可以使用省略号( ...)进行定义:

语法:

function func_name(param1: paramType, param2: paramType, ...params: paramType[]) {
}

举例

function getEmployeeName(firstName: string, ...restOfName: string[]) {
  return firstName + ' ' + restOfName.join(' ');
}

let employeeName = getEmployeeName('坚果', '组织', '专注于', 'HarmonyOS布道');

箭头函数

ES6版本的TypeScript提供了一个箭头函数,它是定义匿名函数的简写语法,用于函数表达式,它省略了function关键字。箭头函数的定义如下,其函数是一个语句块:

( [param1, parma2,…param n] )=> {
    <span>// 代码块</span>
}

其中,括号内是函数的入参,可以有0到多个参数,箭头后是函数的代码块。我们可以将这个箭头函数赋值给一个变量,

5 类

TypeScript支持基于类的面向对象的编程方式,定义类的关键字为 class,后面紧跟类名。类描述了所创建的对象共同的属性和方法。

类的定义

class class_name {
  // 类作用域
}

举例:

class Person {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  info(): string {
     return `My name is ${this.name} and age is ${this.age}`;
  }
}

创建类对象

类定义完后,可以通过 new 关键字实例化一个类的对象,实例化类对象即调用类的构造方法,语法如下

let object_name = new class_name([ args ])

类的继承

TypeScript 支持继承类,创建类的时候可以使用关键字 extends 继承一个已有的类,这个已有的类称为父类,继承它的类称为子类。子类除了不能继承父类的私有成员(方法和属性)和构造函数,其他的都可以继承。语法如下:

class Employee extends Person {
   department: string

  constructor(name: string, age: number, department: string) {
    super(name, age);
    this.department = department;
  }

  public getEmployeeInfo(): string {
    return this.info() + ` and work in ${this.department}`;
  }
}

通过上面的Employee类,我们可以定义一个人物坚果,这里可以获取他的基本信息,也可以获取他的雇主信息,其定义如下:

let person2 = new Employee('坚果', 25, '润开鸿');
person2.info();
person2.getEmployeeInfo();

访问修饰符

TypeScript 中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。TypeScript 支持 3 种不同的访问权限。

  • public(默认) :公有,可以在任何地方被访问。
  • protected:受保护,可以被其自身以及其子类访问。
  • private:私有,只能被其定义所在的类访问。
class Person {
  name: string;
  private age: number;                  // age为private,外界无法访问

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  info(): string {
     return `My name is ${this.name} and age is ${this.age}`;
  }
}

var person = new Person('jianguo', 25);
console.log(person.name);               // harmony
console.log(person.age.toString());     // 编译报错,age为private

6 模块

随着应用越来越大,通常要将代码拆分成多个文件,即所谓的模块(module)。模块可以相互加载,并可以使用特殊的指令 export 和 import 来交换功能,从另一个模块调用一个模块的函数。

两个模块之间的关系是通过在文件级别上使用 import 和 export 建立的。模块里面的变量、函数和类等在模块外部是不可见的,除非明确地使用 export 导出它们。类似地,我们必须通过 import 导入其他模块导出的变量、函数、类等。

7 迭代器

当一个对象实现了Symbol.iterator属性时,我们认为它是可迭代的。一些内置的类型如Array,Map,Set,String,Int32Array,Uint32Array等都具有可迭代性。

let list = [4, 5, 6];

for (let i in list) {
    console.log(i); // "0", "1", "2",
}

for (let i of list) {
    console.log(i); // "4", "5", "6"
}

总结

本文我们跟随课程简单介绍了 TS 基础语法部分,掌握这些基础部分可以支撑日常简单应用开发了。查看更多,可以在参考TypeScript的官方教程(www.typescriptlang.org/docs/)

TypeScript快速入门developer.huawei.com/consumer/cn…

构建列表面

developer.huawei.com/consumer/cn…

页签切换

developer.huawei.com/consumer/cn…