2分钟看完ArkTs的语法介绍

214 阅读3分钟

ArkTS语法介绍

  1. 变量
let message: string = 'Hello';
message = 'hello,world';

// 自动推断类型为string
let message2 = 'hello';
  1. 常量
const message: string = 'hello';
  1. 函数声明
function greet(name:string) :string {
    return 'hello${name}';
}

ArkTs数据类型

  1. Number类型
  2. Boolean类型
  3. String类型
  4. Void类型
  5. Object类型(所有引用类型的基类型)
  6. Array类型
  7. Enum类型
enum ColorSet { Red, Green, Blue }
let c: ColorSet = ColorSet.Red;
  1. Union类型 (多个类型组合成的引用类型)
  2. Aliases类型(匿名类型)
type Matrix = number[][];
type Handler = (s:string,no:number)=>string
type Predicate<T> = (x:T)=>boolean
type NullableObject = Object|null;

ArkTs运算符

  1. === :(严格相等,不会进行隐式转换)
  2. == :(数值相等即可,会转换)
let a:number = 5;
let b:string = '5';

console.log(a === b);  // false
console.log(a == b);  // true
  1. a&b 按位与
  2. a|b 按位或
  3. ~a 按位非
  4. a<<b 将a的二进制向左移b位
  5. a>>b 将a的二进制向右移b位,带符号扩展
  6. a>>>b 将a的二进制向右移b位,左边补0
  7. ?: 条件表达式

ArkTs语句

if语句 break语句 continue语句 switch语句 for语句 do-while语句 try-catch-finally语句

  1. switch语句
switch(expression) {
    case label1: break;
    default:
}
  1. for语句
for(let item of 'string'){}
  1. do-while语句
do{}while(condition)
  1. try-catch语句
try{
    ...
} catch(x){
} finally {
}

ArkTs函数

function add(x:string, y:string, name?:string, default:number = 2) {
    // x,y : 必填
    // name: 可选
    // default: 有默认值
}

// Rest参数
function sum(...number:number[]) :number {
    // 接收任意数量的参数
}

// 函数类型
type trigFunc = (x:number)=>number  // 函数类型
function do(f:trigFunc){
    f(3.14);
}
do(Math.sin);// 将函数作为参数传入

// Lambda函数
let sum1 = (x:number, y:number) => {return x+y;}

// 闭包
function f(): () => number {
  let count = 0;
  let g = (): number => { count++; return count; };
  return g;
}
let z = f();
z(); // 返回:1
z(); // 返回:2

// 函数重载
function foo(x: number): void;            /* 第一个函数定义 */
function foo(x: string): void;            /* 第二个函数定义 */
function foo(x: number | string): void {  /* 函数实现 */
}
foo(123);     //  OK,使用第一个定义
foo('aa'); // OK,使用第二个定义

ArkTs类

// extends 继承   implements 实现接口
class Person extends Father implements IPeople{
    // 普通字段,注意ArkTS要求字段在声明或构造函数中要显式初始化,就是要赋初始值
    name:String = "";
    // 静态字段,属于类级别
    static staticString = "i am static";
    
    constructor(n:string){
        this.name = n;
    }
    
    // 静态方法
    static staticMethod():string {
        return "i am static method";
    }
}
let p = new Person('lpf');
Person.staticString;
Person.staticMethod();
class Point {
    x:number = 0;
}
let p:Point = {x = 1};

ArkTs 修饰符

private/protected/public(默认)

ArkTs 字面量

泛型Record<K,V>用于将键类型的属性映射到另一个类型,可以理解为一个Map存储

let map: Record<string, number> = {
  'John': 25,
  'Mary': 21,
}

map['John']; // 25

ArkTs 接口

interface Style {
    // 第一种写法
    color:string;
    // 第二种写法
    get color():string;
    set color(x:string);
    
    method():void;
}

interface sonStyle extends Style {

}

ArkTs 泛型类

class CustomClass<Element> {
    public push(e:Element):void{
    }
}

let s = new CustomClass<string>();
s.push('hello');

let n = new CustomClass<number>();
n.push(7);

ArkTs 泛型约束

interface Hashable {
  hash(): number;
}
class MyHashMap<Key extends Hashable, Value> {
  public set(k: Key, v: Value) {
    let h = k.hash();
    // ...其他代码...
  }
}

ArkTs 泛型函数

function lastElement<T>(x:T[]):T{
    return x[x.length()-1];
}

lastElement<string>(['a', 'b']);
lastElement<number>([1,2,3]);


// 带默认值的泛型
function lastElement<T=number>():T{}

// 下面的两种写法等价
lastElement();
lastElement<number>();

ArkTs空安全

let x:number|null = null;  // 为空值的变量定义为联合类型 T|null

// 可以为变量x赋值如下
x = 1; 
x = null;
if(x != null) {}

// 非空断言
class A{
    value:number = 0;
}
function method(a:A|null) {
    // 因为a可能为空,所以不能直接访问 a.value
    a.value;  // 编译报错
    a!.value; // 只有a不为空时才能正常执行
}

// 空值合并运算符 ??
a??b :等价于三元运算符 (a!=null && a!=undefined)?a:b

ArkTs可选链

class Person {
  nick: string | null = null;
  // 如果属性是undefined后者null,可选连运算符会返回undefined
  spouse?: Person

  setSpouse(spouse: Person): void {
    this.spouse = spouse;
  }

  getSpouseNick(): string | null | undefined {
    return this.spouse?.nick;
  }

  constructor(nick: string) {
    this.nick = nick;
    this.spouse = undefined;
  }
}