ArkTS语法介绍
- 变量
let message: string = 'Hello';
message = 'hello,world';
// 自动推断类型为string
let message2 = 'hello';
- 常量
const message: string = 'hello';
- 函数声明
function greet(name:string) :string {
return 'hello${name}';
}
ArkTs数据类型
- Number类型
- Boolean类型
- String类型
- Void类型
- Object类型(所有引用类型的基类型)
- Array类型
- Enum类型
enum ColorSet { Red, Green, Blue }
let c: ColorSet = ColorSet.Red;
- Union类型 (多个类型组合成的引用类型)
- Aliases类型(匿名类型)
type Matrix = number[][];
type Handler = (s:string,no:number)=>string
type Predicate<T> = (x:T)=>boolean
type NullableObject = Object|null;
ArkTs运算符
- === :(严格相等,不会进行隐式转换)
- == :(数值相等即可,会转换)
let a:number = 5;
let b:string = '5';
console.log(a === b); // false
console.log(a == b); // true
- a&b 按位与
- a|b 按位或
- ~a 按位非
- a<<b 将a的二进制向左移b位
- a>>b 将a的二进制向右移b位,带符号扩展
- a>>>b 将a的二进制向右移b位,左边补0
- ?: 条件表达式
ArkTs语句
if语句 break语句 continue语句 switch语句 for语句 do-while语句 try-catch-finally语句
- switch语句
switch(expression) {
case label1: break;
default:
}
- for语句
for(let item of 'string'){}
- do-while语句
do{}while(condition)
- 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;
}
}