【HarmonyOS】HarmonyOS NEXT学习日记:二、ArkTs语法

【HarmonyOS】HarmonyOS NEXT学习日记:二、ArkTs语法

众所周知TS是JS的超集,而ArkTs则可以理解为是Ts的超集。他们的基础都基于JS,所以学习之前最好就JS基础。我的学习重点也是放在ArkTs和JS的不同点上。

文章主要跟着官方文档学习,跳过了一些和js相同的地方,保留了一些js和ts不同的地方,同时在一些概念上添加了额外的解读和代码注释。方便ts基础不太扎实或者还没接触过的同学阅读。

在这里插入图片描述

声明

声明变量关键字和js一样,let、const

ArkTS是一种静态类型语言,所有数据的类型都必须在编译时确定,但是定义时有初始值则可以显式指定其类型。

let str: string = 'hello';
let str2= 'hello, world';

上面两种都是定义了string类型的变量。

类型

基本类型和js差不多,主要看看声明类型,和一些特殊的类型用法

String

字符串

let str: string = 'hello';
let str2:string= `The result is ${a}`;

Number

数字

let num: number= 1;

Boolean

布尔类型

let flag: boolean = false;

Void

void类型用于指定函数没有返回值。可以用于泛型类型参数。泛型是什么我们后面会提到。

Object

所有引用类型的基类型

Array

let values: number[] = [1, 2, 3];

Enum

枚举值

enum ColorSet { Red, Green, Blue }
let c: ColorSet = ColorSet.Green;
console.log(c)//2
enum ColorSet { White = '0xFF', Grey = '0x7F', Black = '0x00' }
let c: ColorSet = ColorSet.Black;
console.log(c)//0x00

Union类型

联合类型,是由多个类型组合成的引用类型。联合类型包含了变量可能的所有类型。
比如我想要一个数组既可以储存string也可以储存number就可以像下面这样:

type x = string | number;
let arr: x[] = [1, '2'];

用type定义一个名为x的联合类型,然后使用他声明arr的类型即可。

Aliases

Aliases类型为匿名类型(数组、函数、对象字面量或联合类型)提供名称,或为已有类型提供替代名称。

比如我希望把两层的数组类型多处复用,给这种类型命名Matrix,则可以像下面这样

type Matrix = (number|string)[][]
let arr:Matrix = [[1,2,3],['4','5','6']]

运算符

和js基本一致,略过。想要详细了解的同学可以查看官方文档

语句

什么if else switch之类的用法和js一致,略过。想要详细了解的同学可以查看官方文档

函数

函数声明

函数声明引入一个函数,包含其名称、参数列表、返回类型和函数体。

以下示例是一个简单的函数,包含两个string类型的参数,返回类型为string:

function add(x: string, y: string): string {let z: string = `${x} ${y}`;return z;
}

可选参数

可选参数的格式可为name?: Type

function hello(name?: string) {if (name == undefined) {console.log('undefined');} else {console.log(name);}
}

当然也可以设置参数缺省值

function hello(name: string = 'me') {console.log(name);
}
hello()//输出me

Rest参数

用法与js相同
Rest就是为解决传入的参数数量不一定, rest parameter(Rest 参数) 本身就是数组,数组的相关的方法都可以用。
函数的最后一个参数可以是rest参数。

function sum(...numbers: number[]): number {let res = 0;for (let n of numbers)res += n;return res;
}sum() // 返回0
sum(1, 2, 3) // 返回6

返回类型

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

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

不需要返回值的函数的返回类型可以显式指定为void或省略标注。这类函数不需要返回语句。

function hi1() { console.log('hi'); }
function hi2(): void { console.log('hi'); }

以上两种均可。

函数类型

函数类型通常用于定义回调

type trigFunc = (x: number) => number // 这是一个函数类型function do_action(f: trigFunc) {f(3.141592653589); // 调用函数
}do_action(Math.sin); // 将函数作为参数传入

箭头函数

let sum = (x: number, y: number): number => {return x + y;
}

返回类型可以省略;省略时,返回类型通过函数体推断

函数重载

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

通过 class 关键字来定义一个类, 使用 constructor 定义构造函数。

class Person {name: string = ''surname: string = ''constructor (n: string, sn: string) {this.name = n;this.surname = sn;}fullName(): string {return this.name + ' ' + this.surname;}
}

定义类后,可以使用关键字new创建实例

let p = new Person('John', 'Smith');
console.log(p.fullName());

或者,可以使用对象字面量创建实例:

class Point {x: number = 0y: number = 0
}
let p: Point = {x: 42, y: 42};

字段

字段是直接在类中声明的某种类型的变量。

类可以具有实例字段或者静态字段。

使用关键字static将字段声明为静态。静态字段属于类本身,类的所有实例共享一个静态字段。

ArkTS要求所有字段在声明时或者构造函数中显式初始化.

class Person {static numberOfPersons = 0constructor() {Person.numberOfPersons++;}
}
let me = new Person()
let you = new Person()
console.log(Person.numberOfPersons+'' )//2

getter和setter

setter和getter可用于提供对对象属性的受控访问。

class Person {name: string = ''private _age: number = 0get age(): number { return this._age; }set age(x: number) {if (x < 0) {throw Error('Invalid age argument');}this._age = x;}
}let p = new Person();
p.age; // 输出0
p.age = -42; // 设置无效age值会抛出错误

方法

方法属于类。类可以定义实例方法或者静态方法。静态方法属于类本身,只能访问静态字段。而实例方法既可以访问静态字段,也可以访问实例字段,包括类的私有字段。

!!!所谓的静态方法和静态字段,都属于这个类,而非实例。所以实例是无法调用的,要调用只能通过这个类来调用。!!!

构造函数

类声明可以包含构造函数,使用constructor声明,所谓构造函数就是用来初始化对象状态的
如果未定义构造函数,则会自动创建具有空参数列表的默认构造函数

构造函数重载签名

可以通过编写重载签名,指定构造函数的不同调用方式。具体方法为,为同一个构造函数写入多个同名但签名不同的构造函数头,构造函数实现紧随其后。

class C {constructor(x: number)             /* 第一个签名 */constructor(x: string)             /* 第二个签名 */constructor(x: number | string) {  /* 实现签名 */}
}
let c1 = new C(123);      // OK,使用第一个签名
let c2 = new C('abc');    // OK,使用第二个签名

继承

使用 extends 关键字实现继承,子类中使用 super 关键字来调用父类的构造函数和方法。

  • 子类继承父类后子类的实例就拥有了父类中的属性和方法,但不继承构造函数
  • 子类自己特殊逻辑放在子类中重写父类的逻辑
  • super 可以调用父类上的方法和属性
class Person {name: string = ''private _age = 0get age(): number {return this._age;}
}
class Employee extends Person {salary: number = 0calculateTaxes(): number {return this.salary * 0.42;}
}

也可以用implements实现对接口的继承,但是包含implements子句的类必须实现列出的接口中定义的所有方法,但使用默认实现定义的方法除外。

interface DateInterface {now(): string;
}
class MyDate implements DateInterface {now(): string {// 在此实现return 'now is now';}
}

父类访问

关键字super可用于访问父类的实例字段、实例方法和构造函数。在实现子类功能时,可以通过该关键字从父类中获取所需接口。

我们刚刚说过继承来的子类无法继承构造函数,如果要用的话就可以通过super实现

class RectangleSize {protected height: number = 0protected width: number = 0constructor (h: number, w: number) {this.height = h;this.width = w;}draw() {/* 绘制边界 */}
}
class FilledRectangle extends RectangleSize {color = ''constructor (h: number, w: number, c: string) {super(h, w); // 父类构造函数的调用this.color = c;}draw() {super.draw(); // 父类方法的调用// super.height -可在此处使用/* 填充矩形 */}
}

方法重写

子类可以重写其父类中定义的方法的实现。重写的方法必须具有与原始方法相同的参数类型和相同或派生的返回类型。

方法重载签名

通过重载签名,指定方法的不同调用。具体方法为,为同一个方法写入多个同名但签名不同的方法头,方法实现紧随其后

class C {foo(x: number): void;            /* 第一个签名 */foo(x: string): void;            /* 第二个签名 */foo(x: number | string): void {  /* 实现签名 */}
}
let c = new C();
c.foo(123);     // OK,使用第一个签名
c.foo('aa'); // OK,使用第二个签名

可见性修饰符

类的方法和属性都可以使用可见性修饰符。
可见性修饰符包括:private、protected和public。默认可见性为public。

  • public 自己、自己的子类 和其他类都可以访问 (默认值)
  • protected 受保护的 自己和自己的子类能访问, 其他类不能访问
  • private 私有的 只能自己访问,自己的子类不能访问,其他类更不能访问
Private
class C {public x: string = ''private y: string = ''set_y (new_y: string) {this.y = new_y; // OK,因为y在类本身中可以访问}
}
let c = new C();
c.x = 'a'; // OK,该字段是公有的
c.y = 'b'; // 编译时错误:'y'不可见
Protected
class Base {protected x: string = ''private y: string = ''
}
class Derived extends Base {foo() {this.x = 'a'; // OK,访问受保护成员this.y = 'b'; // 编译时错误,'y'不可见,因为它是私有的}
}

对象字面量

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

class C {n: number = 0s: string = ''
}let c: C = {n: 42, s: 'foo'};

对象字面量只能在可以推导出该字面量类型的上下文中使用

Record类型的对象字面量

泛型Record<K, V>用于将类型(键类型)的属性映射到另一个类型(值类型)。常用对象字面量来初始化该类型的值

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

类型K可以是字符串类型或数值类型,而V可以是任何类型.

interface PersonInfo {age: numbersalary: number
}
let map: Record<string, PersonInfo> = {'John': { age: 25, salary: 10},'Mary': { age: 21, salary: 20}
}

接口

接口声明引入新类型。接口是定义代码协定的常见方式。

任何一个类的实例只要实现了特定接口,就可以通过该接口实现多态。
所谓多态,就是一个类只能继承一个父类,但是可以继承多个接口从而实现多态。

接口使用interface关键字声明

interface Style {color: string // 属性
}
interface AreaSize {calculateAreaSize(): number // 方法的声明someMethod(): void;     // 方法的声明
}

类继承接口使用implements

// 接口:
interface AreaSize {calculateAreaSize(): number // 方法的声明someMethod(): void;     // 方法的声明
}// 实现:
class RectangleSize implements AreaSize {private width: number = 0private height: number = 0someMethod(): void {console.log('someMethod called');}calculateAreaSize(): number {this.someMethod(); // 调用另一个方法并返回结果return this.width * this.height;}
}

接口继承

接口也可以使用extends 实现继承

interface Style {color: string
}interface ExtendedStyle extends Style {width: number
}

泛型类型和函数

泛型类型和函数允许创建的代码在各种类型上运行,而不仅支持单一类型。
即将数据类型也作为参数传递

class CustomStack<Element> {//这里定义了一个Element形参,作为类型public push(e: Element):void {//内部的push方法接受的参数使用Element为类型// ...}
}
let s = new CustomStack<string>();//在实例化的时候,传入Element的实参string用来当做push方法的入参类型
s.push('hello');

泛型约束

泛型类型的类型参数可以被限制只能取某些特定的值。例如,MyHashMap<Key, Value>这个类中的Key类型参数必须具有hash方法。

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

泛型函数

使用泛型函数可编写更通用的代码。比如返回数组最后一个元素的函数:

function last(x: number[]): number {return x[x.length - 1];
}
last([1, 2, 3]); // 3

以上方法只能用于number数组,
如果需要为任何数组定义相同的函数,使用类型参数将该函数定义为泛型:

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

现在,该函数可以与任何数组一起使用。

// 显式设置的类型实参
last<string>(['aa', 'bb']);
last<number>([1, 2, 3]);// 隐式设置的类型实参
// 编译器根据调用参数的类型来确定类型实参
last([1, 2, 3]);

泛型默认值

泛型类型的类型参数可以设置默认值。这样可以不指定实际的类型实参,而只使用泛型类型名称。下面的示例展示了类和函数的这一点。

class SomeType {}
interface Interface <T1 = SomeType> { }
class Base <T2 = SomeType> { }
class Derived1 extends Base implements Interface { }
// Derived1在语义上等价于Derived2
class Derived2 extends Base<SomeType> implements Interface<SomeType> { }function foo<T = number>(): T {// ...
}
foo();
// 此函数在语义上等价于下面的调用
foo<number>();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3246801.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

21天学通C++:第十三、十四章节

第十三章&#xff1a;类型转换运算符 类型转换是一种机制&#xff0c;让程序员能够暂时或永久性改变编译器对对象的解释。注意&#xff0c;这并不意味着程序员改变了对象本身&#xff0c;而只是改变了对对象的解释。可改变对象解释方式的运算符称为类型转换运算符。 为何需要…

追溯源码观察HashMap底层原理

引言&#xff08;Map的重要性&#xff09; 从事Java的小伙伴&#xff0c;在面试的时候几乎都会被问到Map&#xff0c;Map都被盘包浆了。Map是键值集合&#xff0c;使用的场景有很多比如缓存、数据索引、数据去重等场景&#xff0c;在算法中也经常出现&#xff0c;因为在Map中获…

论文《Revisiting Heterophily For Graph Neural Networks》笔记

【ACM】作者从聚合后节点相似性的角度重新审视异配性&#xff0c;并定义了新的同质性度量方法。基于聚合相似度度量这一指标&#xff0c;作者提出了一种新的框架&#xff0c;称为自适应信道混合&#xff08;Adaptive Channel Mixing&#xff0c;ACM&#xff09;&#xff0c;它通…

【青书学堂】2024年第一学期 生产与运作管理(高起专) 作业

【青书学堂】2024年第一学期 生产与运作管理(高起专) 作业 为了方便日后复习&#xff0c;青书学堂成人大专试题整理。 若有未整理的课程&#xff0c;请私信我补充&#xff0c;欢迎爱学习的同学们收藏点赞关注&#xff01;文章内容仅限学习使用&#xff01;&#xff01;&#xf…

Linux的前台进程和后台进程(守护进程)

前台进程 前台进程就是在某个终端中运行的进程&#xff0c;在该终端中通过运行命令运行起该进程&#xff0c;一旦该终端关闭&#xff0c;进程也就随之消失。 后台进程 后台进程顾名思义就是在后台运行的进程&#xff0c;与前台进程不同的是&#xff0c;它不受某一个终端控制…

VBA学习(21):遍历文件夹(和子文件夹)中的文件

很多时候&#xff0c;我们都想要遍历文件夹中的每个文件&#xff0c;例如在工作表中列出所有文件名、对每个文件进行修改。VBA给我们提供了一些方式&#xff1a;&#xff08;1&#xff09;Dir函数&#xff1b;&#xff08;2&#xff09;File System Object。 使用Dir函数 Dir…

国内新能源汽车芯片自给,承认差距,任重道远

【科技明说 &#xff5c; 科技热点关注】 据近日工信部电子五所元器件与材料研究院高级副院长罗道军表示&#xff0c;中国拥有最大的新能源车产能&#xff0c;芯片用量也是越来越多。但是芯片的自给率目前不到10%&#xff0c;是结构性的短缺。 中国拥有最大新能源车产能&#…

超详细信息收集篇

1 域名信息收集 1.1 域名是什么 域名&#xff08;英语&#xff1a;Domain Name&#xff09;&#xff0c;又称网域&#xff0c;是由一串用点分隔的名字组成的 Internet 上某一台 计算机 或计算机组的名称&#xff0c;用于在数据传输时对计算机的定位标识&#xff08;有时也指地…

STM32(六):STM32指南者-定时器实验

目录 一、基本概念1、常规定时器2、内核定时器 二、基本定时器实验1、实验说明2、编程过程&#xff08;1&#xff09;配置LED&#xff08;2&#xff09;配置定时器&#xff08;3&#xff09;设定中断事件&#xff08;4&#xff09;主函数计数 3、工程代码 三、通用定时器实验实…

开放式蓝牙耳机哪个牌子实惠又好用?五款黑马产品任你选

近几年兴起的开放式蓝牙耳机&#xff0c;具有佩戴舒适稳固、不影响使用者判断外界环境等优点&#xff0c;十分适合在户外环境下使用&#xff0c;因此受到了众多健身人士的喜爱。那么该如何挑选到一款适合自己的开放式耳机呢&#xff1f;开放式蓝牙耳机哪个牌子实惠又好用&#…

2024计算机毕设选题技巧|论文写作指南|更多成品项目

&#x1f4bb; 芋圆带你做毕设&#xff1a;你的毕设好帮手 &#x1f44b; 博主介绍&#xff1a; 我是芋圆&#xff0c;全网粉丝20W&#xff0c;CSDN计算机领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云等平台优质作者。大学期间&#xff0c;我不仅协助指导老师进行毕…

对LinkedList ,单链表和双链表的理解

一.ArrayList的缺陷 二.链表 三.链表部分相关oj面试题 四.LinkedList的模拟实现 五.LinkedList的使用 六.ArrayList和LinkedList的区别 一.ArrayList的缺陷: 1. ArrayList底层使用 数组 来存储元素&#xff0c;如果不熟悉可以来再看看&#xff1a; ArrayList与顺序表-CSDN…

12.C++模板进阶 | 代码膨胀

目录 0.引入 函数模板 类模板 1. 非类型模板参数 运用 array 2. 函数模板的特化 2.1 概念 2.2 类模板的特化 全特化 偏特化 3. 模板不可以分离编译 回顾类和对象 3.1 什么是分离编译 3.2 模板的分离编译 4. 模板总结 代码膨胀 代码膨胀的影响&#xff1a; 代…

STM32 BootLoader 刷新项目 (五) 获取软件版本号-命令0x51

STM32 BootLoader 刷新项目 (五) 获取软件版本号-命令0x51 下面我们来讲解第一个指令&#xff0c;获取软件版本号命令-0x51. 在BootLoader中获取软件版本号的操作有多个重要的作用&#xff0c;具体如下&#xff1a; 版本管理&#xff1a; 识别当前版本&#xff1a;通过获取软…

AI+折叠屏,荣耀的创新周期论

文&#xff5c;刘俊宏 编&#xff5c;王一粟 2024年&#xff0c;AI和折叠屏的演进路线&#xff0c;已经成为了手机行业的共识。 首先&#xff0c;手机市场的新增量已经被折叠屏所接管。据Counterpoint Research数据显示&#xff0c;中国2024年第一季度折叠屏手机销量同比增长…

BUUCTF逆向wp [HDCTF2019]Maze

第一步 查壳&#xff0c;本题是32位&#xff0c;有壳&#xff0c;进行脱壳。 第二步 这里的 jnz 指令会实现一个跳转&#xff0c;并且下面的0EC85D78Bh被标红了&#xff0c;应该是一个不存在的地址&#xff0c;这些东西就会导致IDA无法正常反汇编出原始代码&#xff0c;也称…

【系统架构设计】数据库系统(一)

数据库系统&#xff08;一&#xff09; 数据库模式与范式数据库的结构与模式数据模型关系代数数据的规范化反规范化 数据库设计事务管理备份与恢复分布式数据库系统数据仓库数据挖掘NoSQL大数据 数据库模式与范式 数据库的结构与模式 数据库技术中采用分级的方法将数据库的结…

萝卜快跑无人出租车是有人远程代驾? 客服:没有人操控

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 近期“萝卜快跑”无人驾驶网约车相关话题引发网友热议。 有网传图片显示&#xff0c;萝卜快跑机器人智控中心&#xff0c;有真人坐在带有方向盘的屏幕前&#xff1b; 有网友认为所谓的无人网约车&am…

【设计模式】【创建型模式】【02工厂模式】

系列文章 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录 系…

C++链接FTP服务器并下载数据(在qt中编写)

.pro文件 #------------------------------------------------- # # Project created by QtCreator 2024-07-16T13:19:03 # #-------------------------------------------------QT core gui networkgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsTARGET untitled TE…