【鸿蒙】arkTS基础语法

常量和变量

  1. 使用let修饰变量,const修饰常量
  2. 默认要初始化
  3. 类型可以指定,也可以自己推断,但是一旦推断之后,不能再赋其他类型的值
let name: string = 'xiao ming';
name = 'xiao li';
const age: number = 20;
// age = 24; 常量不可重新赋值
console.log(name);
console.log(age.toString());
console.log(`my name is ${name}, i am ${age} yeaers old`);

引用类型

  1. 数组: 使用Array或者[]创建
  2. 自定义类:使用class
let students: Array<string> = ['xiao ming', 'xiao li', 'xiang wang'];
let students_1: string[] = ['xiao ming', 'xiao li', 'xiang wang'];

class User {

}

枚举

enum Color {
  Red,
  Blue,
  Green
}
let favoriteColor: Color = Color.Blue;

类型别名

  1. 使用type对类型名称设置别名
type matrix = number[][];	// 二位数组
let mat: mat = [[1, 2 ,3], [4, 5, 6], [7, 8, 9]];
console.log(mat.toString())

联合类型

  1. 可以使用给一个变量设置不同的类型组合,在重新赋值的时候可以赋值不同的类型
  2. 打印的时候要根据不同的类型输出
let luckyNum: number | string = 7;
console.log(luckyNum.toString());
luckyNum = 'seven';
console.log(luckyNum);

可空类型

  1. 使用null声明可空的类型,但是在使用之前需要进行空值判断
let name_1: string | null = null;
// 1. if/else
if (name_1 != null) {

}
// 2. 空值合并表达式
const res_1 = name_1 ?? '';
// 3. 使用可选链 这个写法目前存在问题
// const len = name_1?.length ?? '';

条件判断

let isVaild: boolean = false;
if (Math.random() > 0.5) {
  isVaild = true;
} else {
  isVaild = false;
}
isVaild = Math.random() > 0.5 ? true : false;

循环语句

let students: Array<string> = ['xiao ming', 'xiaozhang', 'xiaohong'];
// 1. 
for (let i = 0; i < students.length; i++) {
  console.log(students[i]);
}
// 2. 
for (let stu of students) {
  console.log(stu);
}
// 3. 
let index = 0;
while (index < students.length) {
  console.log(students[index++]);
}

函数

// // 函数标识function 函数名字、参数、返回值、函数体
function printStudentsInfo(students: string[]): void {
  for (let stu of students) {
    console.log(stu);
  }
}

printStudentsInfo(students_1);

lambda、匿名函数、箭头函数

const printInfo = (name: string): void => {
	console.log(name);
}
printInfo('xiaoxiao');
// 只有一行可以省略花括号、返回值为空也可以省略(有返回值的时候不能省略括号)
const printInfo_1 = (name: string): string => {return name};
let res = printInfo_1('xiaozhang');
console.log(res);

const printInfo_2 = (name: string) => console.log(name);
printInfo_2('xiaoniu');

// 匿名函数用做参数(第一个参数时必须的,可以取前两个,但是不能取第一个和第三个)
// 取三个参数
students.forEach((stu: string, index: number, students: string[]) => console.log(stu));
// 取前两个参数
students.forEach((stu: string, index: number) => console.log(stu));
// 只取第一个参数
students.forEach((stu: string) => console.log(stu));

// 匿名函数做返回值
function outerFunc(): () => string {
  let count = 0;
  return (): string => {
    count++;
    return count.toString();
  }
}
// 可以用别名简化写法
type callback = () => string;
function outerFunc(): callback {
  let count = 0;
  return (): string => {
    count++;
    return count.toString();
  }
}

// 闭包捕获变量,计数器的实现,对外不暴露细节
let invoker = outerFunc();
console.log(invoker());
console.log(invoker());

  1. 声明和使用
  2. 使用访问控制,进行封装,使用get和set方法为私有数据提供接口
  3. 使用constructor对属性进行赋值,如果属性没有赋值,一定要有构造函数对这些属性赋值
  4. 使用this在类中访问属性,默认访问权限为public

访问权限修饰,实现封装

class Person {
  public name: string = 'xiao xiao';
  private _age: number = 20;
  isMale: boolean = true;

  // 构造函数
  constructor(name: string, age: number, isMale: boolean) {
    this.name = name;
    this._age = age;
    this.isMale = isMale;
  }

  get age(): number {
    return this._age;
  }

  set age(age: number) {
    this._age = age;
  }
  printInfo() {
    if (this.isMale) {
      console.log(`${this.name} is a boy, and he is ${this.age} years old`);
    } else {
      console.log(`${this.name} is a girl, and she is ${this.age} years old`);
    }
  }
} 
const p1: Person = new Person('xiao x', 22, true);
p1.printInfo();
// 私有变量不可访问,没有age的属性只有age的方法用来获取_age的属性
// console.log(p1.age()); console.log(p1._age.toString()); 
console.log(p1.age.toString());

继承和多态

  1. 继承的时候,新增的属性也要在构造方法中赋值
  2. 先调用父类的构造函数,再写子类的逻辑
  3. 子类一定要调用父类的构造函数,但是一般的函数可以不调用
// 继承,代码复用
class Employee extends Person {
  department: string;

  constructor(name: string, age: number, isMale: boolean, department: string) {
    super(name, age, isMale);
    this.department = department;
  }
  // 子类重载,多态的应用
  public  printInfo() {
    super.printInfo();
    console.log(this.department);
  }
}
let employee = new Employee('xiao hong', 18, false