ArkTS语言(二)

学习ArkTS语言

ArkTS是HarmonyOS的主要应用开发语言,在TypeScript基础上进行了扩展,保留了其基本风格,并通过增强静态检查和分析来提高程序的稳定性和性能。本教程将帮助开发者掌握ArkTS的核心功能、语法及最佳实践,以便高效地构建高性能移动应用。

1.函数

1.1 函数概述

函数是可以被重复使用的代码块,它可以接受输入参数,执行一系列操作,然后返回输出结果。

为了方便大家理解,我想到一个非常形象的生活案例帮助大家理解;如下图所示,有一个包饺子神器,当我们需要包饺子时,准备好饺子皮和饺子馅,放在包饺子神器上一夹,一个完整的饺子就做出来了。
在这个案例中,包饺子神器就是一个可以重复利用的函数,饺子皮和陷就是函数接受的参数,而“夹”这个动作就是函数执行的操作,做出来的饺子就是函数的返回结果。

函数必须先声明才能使用,函数声明包含其名称、参数列表、返回类型和函数体。下面是函数声明的格式

function 函数名(参数名1: 类型, 参数名2: 类型): 返回值类型{
  ....
  return 返回值; 
}

例:声明一个函数,能够接受两个整数,执行求和的操作,并返回两个数的和。

function add(x:number, y: number): number{
  let z = x+y;
  return z;
}

1.2 函数调用

注意函数声明好了,必须调用才能执行。下面演示函数的调用

let s = add(3,4)	//调用add函数,求3与4的和,并把和值赋值给变量s
console.log(”两个数的和为:",s)

let s1 = add(4,6)	//重复调用add函数
console.log(”两个数的和为:",s1)

1.3 无返回值函数

函数可以没有返回值,此时方法体内不需要写return语句,返回值类型用void代替
例:声明一个函数,能够接受两个整数,执行求最和操作,直接和在函数内打印输出。

//声明函数
function max(x:number, y: number): void{
  let z = x+y;
  console.log(”两个数的最大:",z)
}
//调用函数
max(3,4)
max(4,6)

1.4 无参数函数

函数可以不接受输入数据,此时()中什么都不写,调用函数时也不用传递参数。
例:声明一个函数,打印10个“Hello HarmonyOS”

//声明函数
function print(){
  for (let i=0; i<10;i++){
    console.log('Hello HarmonyOS')
  }
}

//调用函数
print()

1.5 返回类型推断

如果可以从函数体内推断出函数返回类型,则可在函数声明中省略标注返回类型。

// 显式指定返回类型
function foo(): string {
  return 'foo';
}

// 推断返回类型为string
function goo() {
  return 'goo'; 
}

1.6 箭头函数

箭头函数(又名Lambda函数),它是一种比普通函数更加简洁的函数写法。

  • 箭头函数的格式
let 函数名 = (参数列表):返回值类型=>{
      函数的执行代码
      return 结果
}

例:使用箭头函数,矩形的面积

//声明箭头函数
let rectArea = (width: number, height: number): number => { return width * height }

//调用箭头函数
let s1: number = rectArea(100,50)
  • 箭头函数的返回值类型可以省略,省略时,返回值通过类型推断;
//声明箭头函数
let rectArea = (width: number, height: number) => { return width * height }

//调用箭头函数
let s1 = rectArea(100,50)
  • 如果箭头函数的函数体语句只有一条,{}、return也可以省略
//声明箭头函数
let rectArea = (width: number, height: number) => width * height 

//调用箭头函数
let s2 = rectArea(100,50)

1.7 高阶函数

高阶函数是指:接受函数作为参数,或者返回一个函数的函数。

  • 通常将箭头函数作为方法的参数使用
// 这是一个高阶函数,它接受一个函数作为参数
function greet(callback:Function) {
    callback();  // 调用回调函数
}

// 箭头函数作为参数传递
greet(() => {
    console.log("Welcome!");
})

1.8 可选参数

在参数名称后面加上?表示参数是可选的,意思就是调用时可以传递参数,也可以不传递参数。

function buildName(firstName: string, lastName?: string) {
    if (lastName)
        return firstName + " " + lastName;
    else
        return firstName+"富贵";
}
 
let result1 = buildName("李");  // 正确
let result2 = buildName("李", "世明");  // 正确

1.9 可变参数

可变参数指的是可以让函数接受任意数量的参数。可变参数其本质是一个数组。

// 需求:定义函数,求任意几个数据的和
function sum(...numbers: number[]): number {
  let sum = 0;
  for (let num of numbers) {
    sum += num;
  }
  return sum;
}

// 调用函数,传入任意数量的参数  
let res1 = sum(1, 2, 3)
let res2 = sum(1, 2, 3, 4, 5, 6)

2. 面向对象

2.1 对象概述

面向对象是一种编程方式,这种编程方式的核心是把关注点放在对象身上,每个对象包含自身的数据和对数据的处理方式。

如下图所示:
● 学生是一个对象:包含有学生的姓名、语文、数学成绩等数据、以及对这些数据进行处理的函数。
● 汽车是一个对象:包含有汽车的品牌、颜色、价格等数据、以及对这些数据进行处理的函数。
● 手机是一个对象:包含有品牌、价格、CPU型号等数据、以及对这些数据进行处理的函数。

所以,对象可以理解成是一个封装有数据和函数的容器。 数据在哪个对象中,就调用哪个对象的函数来处理数据。

2.2 类与对象

我们知道对象中包含数据以及对数据处理的函数。 那问题来了,对象中封装哪些数据? 对数据进行怎样的处理? 这就需要引出类的概念:类。类就是用来描述对象的属性和行为的,类是对象的模版。

  1. 定义类

定义类的关键字为 class,后面紧跟类名(约定首字母大写),类中的成员一般由属性、构造函数、方法组成;
● 属性:表示字对象拥有的相关数据;
● 构造函数:创建对象时执行,用于给属性初始化值;
● 方法:处理属性数据的行为

示例:

//定义学生类
class Student {
  //属性:表示字对象拥有的相关数据;
  name: string
  chinese: number
  math: number

  //构造函数:创建对象时执行,用于给属性初始化值;
  constructor(name: string, chinese: number, math: number) {
    this.name = name
    this.chinese = chinese
    this.math = math
  } 

  //方法:处理属性数据的行为
  printTotal(): void {
    console.log(this.name + "的总分:"+(this.chinese + this.math)) 
  }
} 
  1. 创建Student对象
    有了Student类之后,就可以Student类为模版创建出一个一个的对象实体。
//这里new关键字,用于执行Student类的构造器
let stu1 = new Student('张三', 90, 100)
stu1.printTotal() //张三的总分: 190

//这里new关键字,用于执行Student类的构造器,没传递参数,此时使用的是默认值
let stu3 = new Student()
stu3.printTotal() //Unkonw的总分: 0

2.3 对象字面量

对象字面量是一个表达式,可用于创建类实例并提供一些初始值。它在某些情况下更方便,可以用来代替new表达式。

对象字面量的表示方式是:封闭在花括号对{}中的'属性名:值'的列表。

class Dog{
  name: string = ''
  age: number = 0
}

//对象字面量
let dog: Dog = {name: '旺财', age: 2} 

//调用对象的属性
console.log('狗的姓名',dog.name)	//狗的姓名 旺财
console.log('狗的年龄',dog.age)	//狗的年龄 0

也可以在数组中用,在数组中存储多个对象字面量

let dogs: Dog[] = [{name: '旺财', age: 2},{name: '大黄', age: 5}]
for (let dog of dogs){
  console.log(`狗的名字:${dog.name}, 狗的年龄:${dog.age}`)
}

2.4 继承

继承是面向对象编程(OOP)中的一个非常重要的概念,它允许我们创建一个新类(子类),该子类可以继承现有类(父类)的属性和方法。通过继承,子类可以重用父类的代码,并且可以根据需要进行扩展和修改。

示例:

让Employee员工类继承Person类,同时Employee类扩展了新的dept属性和getEmployeeInfo()方法。

  • 定义Person类
//定义类 Person
class Person {
  //类中的属性
  private name: string
  private age: number

  //构造器
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

	//方法
  public getPersonInfo(): string {
    return `My name is ${this.name} and age is ${this.age}`; 
  }
} 
  • 定义Employee类
//Employee员工类 继承 Person人类
class Employee extends Person {
  //部门
  private dept: string

  //构造器
  constructor(name: string, age: number, dept: string) {
    super(name, age);	//super(...)
    this.dept = dept;
  } 

  //方法
  public getEmployeeInfo(): string {
    return this.getPersonInfo() + ` and work in ${this.dept}`; 
  } 
} 
  • 测试创建Employee对象,调用子类和父类方法
let p3 = new Employee('Tom', 28, 'HuaWei');
console.log(p3.getPersonInfo());	//"My name is Tom and age is 28" 
console.log(p3.getEmployeeInfo());	//"My name is Tom and age is 28 and work in HuaWei" 

2.5 可见性修饰符

类的属性、函数、构造器都叫做类的成员,他们都可以使用可见性修饰符修饰。可见性修饰符包括:private、protected和public。默认可见性为public。
● public(公有)
public修饰的类成员在程序的任何可访问该类的地方都是可见的。
● private(私有)
private修饰的成员不能在声明该成员的类之外访问,例如:

  • protected(受保护)
    protected修饰符的作用与private修饰符非常相似,不同点是protected修饰的成员允许在派生类(子类)中访问,例如:

2.6 接口

接口是一系列抽象函数和属性的集合,这些属性都应该是抽象的,需要由具体的类去实现。

  1. 接口定义
    接口定义如下:定义一个Animal接口,描述动物的行为有eat()和sleep()
interface Animal{
  name: string
  age: number

  eat():void; //吃,怎么吃不知道
  sleep():void; //睡,怎么睡也不知道
} 
  1. 接口实现
    接口定义好之后,需要类来实现接口中的抽象方法。这里所说的实现实际上就是方法重写的意思,而且必须重写接口中的全部抽象方法,有属性同时必须给属性赋值。
class Dog implements  Animal{
  name: string ='大黄';
  age: number = 2;

  eat(): void {
    console.log(`${this.name}今天${this.age}岁了,它坐在家门口吃东西`)
  }

  sleep(): void {
    console.log(`${this.name}今天${this.age}岁了,它坐在家门口睡觉`)
  }
}
//创建对象
let dog = new Dog();
dog.eat();
dog.sleep();
  1. 接口对象
    还可以在无需定义接口实现类的情况下,直接通过接口直接创建对象。
//接口
interface IPerson {
  firstName: string,
  lastName: string,
  sayHi: () => string
}

//接口实例
let customer: IPerson = {
  firstName: "Tom",
  lastName: "Hanks",
  sayHi: (): string => {
    return `${customer.firstName} ${customer.lastName} Hi I'm here`
  }
}

//调用实例方法
let res = customer.sayHi()
console.log(res)

2.7 多态

多态是面向对象编程(OOP)中的核心概念之一,它允许不同类的对象通过相同的接口表现出不同的行为。多态的本质是“同一接口,不同实现”,这使得程序在面对不同类型的对象时,能够根据具体类型自动调用对应的方法,而不需要显式区分对象的类型。

//形状接口
interface IShape{
    area():number; 
}

//矩形类
class Rect implements IShape{
    width:number;
    height:number

    constructor(widht:number, height:number){
        this.width = widht;
        this.height = height;
    }

    public area():number{
        return this.width*this.height
    }
}

//圆形类
class Circle implements IShape{
    radius:number

    constructor(radius:number){
        this.radius = radius;
    }

    public area():number{
        return this.radius*this.radius*Math.PI;
    }
}

//定义一个形状操作类
class ShapeOperation{
    //求任意形状的面积
    public printShapArrea(shape:IShape):void{	// shape: IShape = new Rect(3,4)
        let rest = shape.area();  
        //判断shape是否为Rect的实例
        if(shape instanceof Rect){
            console.log("矩形的面积"+rest)
        }else if(shape instanceof Circle){
            console.log("圆形的面积"+rest)
        }
    } 
}

//创建形状操作类对象
let sop = new ShapeOperation();
//求矩形的面积
sop.printShapArrea(new Rect(3,4));
//求圆形的面积
sop.printShapArrea(new Circle(10));

3. 内置函数

在ArkTS中内置来很多函数可以直接调用,这些函数是全局的,在哪里都能用

3.1 parseInt() 和 parseFloat()

● parseInt() 用于将字符串解析成整数。
● parseFloat() 用于将字符串解析成浮动点数。

parseInt("10");  // 10
parseFloat("10.5");  // 10.5

3.2 decodeURI() 和 encodeURI()

● decodeURI() 用于解码一个已编码的 URI 字符串。
● encodeURI() 用于编码一个 URI 字符串。

encodeURI("https://www.example.com/?name=John Doe"); // "https://www.example.com/?name=John%20Doe"
decodeURI("https://www.example.com/?name=John%20Doe"); // "https://www.example.com/?name=John Doe"

3.3 setTimeout() 和 setInterval()

● setTimeout() 用于在指定的时间延迟后执行某个函数。
● setInterval() 用于每隔一段时间重复执行某个函数。

setTimeout(() => console.log("Hello after 2 seconds"), 2000);  // 2秒后输出
setInterval(() => console.log("Hello every 2 seconds"), 2000);  // 每2秒输出

3.4 clearTimeout() 和 clearInterval()

  • clearTimeout() 用于取消由 setTimeout() 设置的定时器。
  • clearInterval() 用于取消由 setInterval() 设置的定时器。
const timeoutId = setTimeout(() => console.log("This won't be logged"), 2000);
clearTimeout(timeoutId);  // 取消定时器

const intervalId = setInterval(() => console.log("Hello every 2 seconds"), 2000);
clearInterval(intervalId)  //取消定时器

3.5 String()、Number()、Boolean()

  • 这些函数用于将其他类型的数据转换为字符串、数字或布尔值。
String(123);  // "123"
Number("123");  // 123
Boolean(0);  // false	,0为假,非0为真

3.6 JSON.parse() 和 JSON.stringify()

● JSON.parse() 用于将 JSON 字符串解析为 JavaScript 对象。
● JSON.stringify() 用于将 JavaScript 对象转换为 JSON 字符串。

interface Student{
  name:string,
  age:number
}

let student:Student = {
  name:"张三",
  age:20
}

let jsonString:string = JSON.stringify(student)
console.log(jsonString) // '{"name":"张三","age":20}'

const student1 = JSON.parse('{"name":"张三","age":20}') as Student
console.log(`${student1.name}`)   //张三
console.log(`${student1.age}`)   	//20

鸿蒙学习地址

posted @ 2025-10-29 14:44  leon_teacher  阅读(15)  评论(0)    收藏  举报