基础语法
ArkTS是HarmonyOS首推的应用开发语言,是Ark(华为方舟编译器)和TypeScript的结合体。
而TypeScript又是JavaScript的超集。因此,ArkTS完全兼容JavaScript的语法。
所以,学习ArkTS其实就是在学习TypeScript。
ArkTS对TypeScript进行了扩展,通过规范定义强化开发期静态检查和分析,提升程序执行稳定性和性能。
注意
无需额外安装TypeScript编译环境,所有的代码都可以直接在TypeScript演练场中验证执行。
变量和常量
// 变量声明以关键字let开头,类型在名称之后
let var1: string = "hello";
var1 = "world";
// 常量以关键字const开头
const MY_VALUE1: string = "hello world";
// 如果声明变量和常量时已经包含了初始值,那么就不需要显式指定类型
let var2 = "hello world";
const MY_VALUE2 = "hello world";
// 可以通过管道符号(|)将变量定义成多种类型
let var3: string | number;
var3 = 1;
var3 = "lixingyun";
数据类型
ArkTS是强类型语言,它支持下面这几种数据类型。
数字类型
number
可以是任何整数和64位浮点数,也可以采用科学计数法、二/八/十/十六进制表示。
let n1: number = 3.14;
let n2: number = .5;
let n3: number = 1e2;
// 二进制
let n4: number = 0b11;
// 八进制
let n5: number = 0o11;
// 十六进制
let n6: number = 0xff11;
布尔类型
boolean
类型只有两个值:true
和false
。
let ok: boolean = true;
if (ok) {
console.log("hello lixingyun");
} else {
console.log("hello wanglin");
}
// 输出"hello - lixingyun"
字符串类型
string
是由单引号或双引号括起来的,零个或多个字符组成的字符序列。
// 加入转义字符
let s1 = 'hello world\n';
// 拼接字符串
let s2 = 'this is a ' + 'string';
let s3 = 'Success';
// 使用反引号(`)来定义多行文本和内嵌表达式,内嵌表达式的形式是${VARIBABLE}
let s4 = `The result is ${s3}`;
// 输出"The result is Success"
console.log(s4)
// 多行文本
let s5 = `No longer mourn for me when I am dead
Then you shall hear the surly sullen bell
Give warning to the world that I am fled`;
console.log(s5);
数组类型
和其他所有语言一样,array
是由同一类型的数据元素所组成的序列。
// 定义数组
let names: string[] = ["lixingyun", "wanglin", "xiaoyan"];
// 输出"lixingyun"
console.log(names[0]);
元组类型
和数组不同的是,元组中的元素类型不必相同。
// 定义元组
let names1: [string, number] = ["lixingyun", 20];
// 输出"lixingyun"
console.log(names1[0]);
// 下面的定义方式是错误的
let names2: [string, number] = [20, "lixingyun"];
枚举类型
enum
是预先定义的一组命名的值类型。
// 定义枚举
enum ColorSet {RED, GREEN}
let c: ColorSet = ColorSet.RED;
// 输出0
console.log(color);
// 常量与值(整数/字符串)的绑定
enum ColorSet {WHITE = 0x1F, GREY = 0x2F}
let color: ColorSet = ColorSet.GREY;
// 输出47
console.log(color);
联合类型
union
是一种特殊的类型,它是由多个类型组合成的引用类型,包含了变量可能的所有类型。
// 定义类
class Cat {
run() {
console.log("run");
}
miao() {
console.log("miao");
}
}
class Dog {
eat() {
console.log("eat");
}
wang() {
console.log("wang");
}
}
type Animal = Cat | Dog | number;
let animal: Animal = new Cat();
// 联合类型的变量,能赋值为任何组成类型的有效值
animal = new Dog();
function test(animal: Animal) {
// 可以用instanceof来判断对象的类型,animal在这里是Dog类型
if (animal instanceof Dog) {
// 所以可以调用Dog的方法
animal.wang();
}
}
// 输出"wang"
test(animal);
animal = 1;
// 输出1
console.log(animal);
特殊类型
void
类型用于指定函数没有返回值,也可以用于泛型类型参数。
// 接受一个泛型参数
class Class<T> {
dothing(value:T) {...}
}
// 不接受任何参数
let instance: Class<void>
Object
类型可以是任何值,包括基本类型的值都能直接被赋给Object
类型的变量。
null
类型表示对象值缺失或空引用,当使用typeof
判断null
时,返回的是Object
。
undefined
类型表示变量或对象未定义,当使用typeof
判断undefined
时,返回的也是undefined
。
never
类型表示从来不会出现的值,never
类型的变量只能被never
类型赋值。
null
和undefined
类型是其他任何类型(包括void
类型)的子类型,当null
或undefined
类型赋值给其他类型后,变量也会变成null
或undefined
类型。never
类型是其他任何类型(包括null
和undefined
类型)的子类型。
let n1: never;
let n2: number;
// 错误
n1 = 1;
// 正确
n1 = (() => {throw new Error("error")})();
// 正确
n2 = (() => {throw new Error("error")})();
// 返回nevere类型的异常函数
function test1(arg: string): never {
throw new Error("error");
}
// 返回nevere类型的无限循环函数
function test2(): never {
while(true) {}
}
any
类型表示变量可以是任意一种类型(类似于Go语言中的any
类型),常用于类型会动态改变的情况。
let n1: any;
n1 = 3.14;
// 输出3.14
console.log(n1)
n1 = "lixingyun";
// 输出"lixingyun"
console.log(n1)
let arr: any[] = [0, true, "lixingyun"];
// 输出true
console.log(arr[1])
最后是Aliases
类型,它为匿名类型提供名称,或为已有类型提供替代名称。
运算符
ArkTS有如下几种运算符。
单目运算符
:--
、++
、+=
、-=
、*=
、/=
、%=
、<<=
、>>=
、>>>=
、&=
、|=
、^=
。比较运算符
:===
、!==
、==
、!=
、>
、>=
、<
、<=
。算术运算符
:-
、+
、*
、/
、%
。逻辑运算符
:&&
、||
、!
。位运算符
:&(按位与)
、|(按位或)
、^(按位异或)
、~(按位非)
、<<
、>>
、a>>>b(a右移b位且左边补0)
。三元运算符
:?:
。类型运算符
:typeof
和instanceof
。其他运算符
:-(负号运算符)
、+(字符串连接运算符)
、.(分量运算符)
、[](下标运算符)
。
感谢支持
更多内容,请移步《超级个体》。