ArkTs基础语法

news2024/11/13 22:32:51

ArkTs基础语法

  • 声明
    • 变量声明
    • 常量声明
    • 自动类型推断
  • 类型
    • 基础类型
      • Number
      • Boolean
      • String
    • 引用类型
      • Void
      • Object
      • Array
      • Enum
      • Union
      • Aliases
  • 语句
    • if语句
    • switch语句
    • 条件表达式 ?:
    • for语句
    • for of语句
    • while语句
    • do while语句
    • break
    • continue
    • throw和try catch finally语句
  • 函数
    • 函数声明
    • 可选参数
    • Rest参数
    • 返回类型
    • 函数的作用域
    • 函数类型
    • 箭头函数
    • 闭包
      • 闭包的使用场景
        • 用来返回某个值
        • 函数赋值,在函数内部定义函数表达式,ArkTs不支持该使用方式
        • 将闭包作为函数的参数,形成回调函数
    • 函数重载
    • 类初始化、字段、创建实例
    • 继承
    • 可见性修饰符
    • 泛型默认值
  • 空安全
    • 可选链
    • 非空断言
    • 空值合并运算符
  • 模块
    • 导出
    • 导入
      • 静态导入
        • 导入绑定
    • 动态导入
    • 导入kit

声明

变量声明

let s: string = 'hello';
s = 'hello world';

常量声明

const s:string = 'hello world';

自动类型推断

ArkTs声明变量的时候,如果存在初始值,那么就可以省略变量类型,ArkTs会根据初始值自动推断变量类型。ArkTs是静态类型语言,变量类型在编译时就已经确定,不允许在代码中动态修改变量类型。

let s: string = 'hello';
let s = 'hello';

类型

基础类型

Number

ArkTs提供number和Number类型, 任何整数和浮点数都可以被赋予这两种类型。

let n1 = 3.14;
let n2 = 3.141592;
let n3 = .5;
let n4 = 1e2;

function factorial(n: number): number {
  if (n <= 1) {
    return 1;
  }
  return n * factorial(n - 1);
}

factorial(n1)  //  7.660344000000002 
factorial(n2)  //  7.680640444893748 
factorial(n3)  //  1 
factorial(n4)  //  9.33262154439441e+157 

Boolean

let isDone: boolean = false;

String

string类型可以用单引号’或者双引号“来包裹,如果要使用字符串模板,那么字符串需要用反引号`来包裹。

let s1 = 'hello';
let s2 = "hello";
let s3 = `hello ${a}`;

引用类型

Void

void一般用于表示函数没有返回值,也可以用于泛型中。

Object

Object是所有类型的基类,任何类型都可以被赋予Object类型的变量。

Array

数组

Enum

枚举类型

enum ClolrSet {Red, Green, Black}
let color : ColorSet = ColorSet.Red;

也可以给枚举常量显示赋值

enum ColorSet {Red = 0xff}

Union

union,联合类型,由多个类型联合组成的引用类型,联合类型的变量,可能是联合类型中任意一种类型。联合类型需要用type关键字来进行定义。

type A = number | string
let a : A = 3;
a = 'abc'; 

据鸿蒙官方文档,在联合类型中,可以用instanceof关键字来进行类型判断

if (a instanceof string) {
	//do something
} else if (a instanceof number) {
	//do something
}

实际在DevEco studio中实测,instanceof关键字不可用,会报错提示instanceof左侧类型必须为any

在这里插入图片描述

实际上arkTs中也没有any类型,只有Object类型
在这里插入图片描述

实测,可以用typeof关键字来确认联合类型中的具体类型
在这里插入图片描述

Aliases

aliases类型主要是为匿名函数、联合类型或者已有类型进行新的命名,使用type关键字

type Matrix = number[][]
type Callback = (s: string, num: number) => string  //回调函数
type Callback1<T> = (x: T) => boolean;  //带泛型的回调函数
type nullableString = string | null    //联合类型,定义可空字符串

语句

if语句

switch语句

条件表达式 ?:

for语句

for of语句

for of 语句可以用来遍历数组、map、字符串等。

let arr = [10, 20, 30];

for(let a of arr) {
	console.log(a);
}

while语句

do while语句

break

continue

throw和try catch finally语句

函数

函数声明

一个函数包括关键字、函数名称、参数、返回值、方法体。

function add(a:number, b:number) : number {
	return a + b;
}

可选参数

可选参数有两种形式,name?: Type 或者 a : number = 2

function a (name?:string) {
	if(name == undefined) {
		console.log('没有传入可选参数');
	} else {
		console,log(name);
	}
}

function b (name : string = 'abc') {
	console.log(name);
}

b(); //输出abc
b('def');//输出def

Rest参数

函数的最后一个参数可以是rest参数,允许函数接收任意数量的实参。

// rest参数由... 参数名称:数组形式的参数类型组成
function c (... s : string[]) {

}

返回类型

ArkTs允许函数省略返回类型,由编译器从函数中推断返回类型

function a() : string {return 'abc';}
等价于
function b() {return 'abc';}

function c() :void {console.log('abc');}
等价于
function d() {console.log('abc');}

函数的作用域

函数内定义的变量仅能从函数内部方位,无法从函数外部访问。如果函数内部定义的变量与函数外部定义的函数同名,则函数内部定义的变量将会覆盖外部定义。

函数类型

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

//定义了一个Callback类型,该类型是一个接收string入参,没有返回值的函数
type Callback = (message : string) => void;

//创建一个使用回调的函数
function doSomething(callback: Callback) {
	callback('abc');
}

//使用回调函数,打印出abc
doSomething((message) => {
	console.log(message);
}

箭头函数

箭头函数又称为lambda函数,例如

// 箭头函数可以通过将函数赋值给一个变量,可以省略function关键字
// 用`=>`连接函数体
let a = (a:number, b:number) : number => { return a+b;}

//同时也可以省略返回类型,由编译器进行类型推断,等价于
let b = (a:number, b:number) => {return a+b;}

//如果函数只有一行的话,花括号和return也可以省略,等价于
let c = (a:number,b:number) => a+b;

闭包

在一个函数内部调用/创建另一个函数。把内嵌的函数称为闭包,它可以访问外部函数的局部变量。

闭包通常用于回调函数。

闭包的使用场景

用来返回某个值
function a() {
	let s = 'hello';
	return () => s; //arkTs没有函数表达式,只能使用箭头函数
}
let c = a();
let d = c(); 
console.log(d); //打印d的结果为hello,实际调用的是b函数(d是c()的返回结果,c是a()的引用,a()实际返回的是b(),b()的返回值是a()内部的变量s)
函数赋值,在函数内部定义函数表达式,ArkTs不支持该使用方式
将闭包作为函数的参数,形成回调函数
let a = (num: number,) => {
  return console.log(num.toString());
}

function b(number1: number, number2: number, callback: (num: number) => void) {
  let sum = number1 + number2;
  callback(sum);
}

b(1, 2, a)

与函数类型结合使用,演进为

type Callback = (num: number) => void;

let a = (num: number,) => {
  return console.log(num.toString());
}

function c(number1: number, number2: number, callback: Callback) {
  let sum = number1 + number2;
  callback(sum);
}

c(1, 2, a)

进而演进,形成我们经常使用的回调函数

type Callback = (num: number) => void;

function d(number1: number, number2: number, callback: Callback) {
  let sum = number1 + number2;
  callback(sum);
}

d(1, 2, (num) => {
  console.log(num.toString())
})

函数重载

我们可以通过编写重载,指定函数的不同调用方式。具体方法为,为同一个函数写入多个同名但签名不同的函数头,函数实现紧随其后,函数定义和实现需要跟在一起

function foo(x: number): void;            /* 第一个函数定义 */
function foo(x: string): void;            /* 第二个函数定义 */
function foo(x: number | string): void {  /* 函数实现 */
	consolo.log(x.toString());
}

foo(123);     //  OK,使用第一个定义
foo('aa'); // OK,使用第二个定义

类初始化、字段、创建实例

以下是一个示例

class Person {
  private name: string
  private age: number

  constructor(name: string, age: number) {
    this.name = name
    this.age = age
  }

  say() {
    console.log(`my name is ${this.name}, i am ${this.age}`)
  }
}

arkTs中,类中的方法直接定义,不需要function关键字。

arkTs中,类的属性值默认情况下是需要在定义的时候进行赋值,或者在构造函数中进行赋值。以保证尽可能少的返回undefined的情况,如果确实需要有undefined情况,可以按照如下写法

class Person1 {
  private name?: string

  getName(): string | undefined {
    return this.name
  }
}

let person1 = new Person1()

person1.getName()?.length

在上述示例中,字段上边使用?:关键字,表示该字段可以是undefined,这样可以不用进行初始化。
此时该字段的实际类型为联合类型stirng|undefined,可以看到get方法中的返回值。
在实例化该对象后,调用getName方法时,需要进行判空或者使用?.可选链语法

arkTs不支持多构造函数,会报错,仅允许相同参数数量,但多种类型的构造方法重载,与函数重载类似
在这里插入图片描述

创建对象需要用到new关键字

let person = new Person("name",15);
person.say();

也可以用字面量的方式来创建对象,仅限于简单类型,没有自定义方法的类

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

get和set方法

class Person {
  private name: string
  private _age: number
  static a: string

  constructor(name: string, age: number) {
    this.name = name
    this._age = age
  }

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

  set age(num:number) {
    //可以在这里做一些校验类的操作
    this._age = num;
  }

  say() {
    console.log(`my name is ${this.name}, i am ${this.age}`)
  }
}

let person = new Person("name", 15);
person.say();

person.age;//输出15
person.age = 100;

上述例子中,我们对age属性设置了get和set方法,arkTs中,get和set方法,最终也是通过字段的形式去读取和设置的,所以在定义get和set方法的时候,虽然有前置的get和set关键字,但是方法名还是不能和字段名重复,否则会报错重复定义。
同时,加上前置的get和set关键字后,该方法就可以直接用字段的形式进行访问,方法名字和对应的字段名之间没有具体的关联,可以随意设置,但不能相同。

继承

class extends A implements b {
 
}

可见性修饰符

private protected public 默认为public

泛型默认值

泛型类型的类型参数可以设置默认值。这样可以不指定实际的类型实参,而只使用泛型类型名称。

空安全

默认情况下,arkTs中的所有类型都是不可为空的。 不经处理的情况下,直接赋值null会报错。

可选链

arkTs中使用?.来表示可选链,在访问对象属性时,如果该属性是null或者undefined时,可选链上后续代码将不在执行,直接返回undefined

非空断言

在调用链中,我们可以使用!.的方式来进行非空断言,此时编译器将不在对可空对象进行校验。在实际运行中,如果使用断言的位置出现了null,将抛出异常。

空值合并运算符

在arkTs中,使用??作为空值合并运算符,当??左侧的值为null或者undefined时,返回右侧结果,否则返回左侧结果,等价于使用三元运算符进行判断。

模块

一个程序中,可以被划分为多组编译单元或者模块。

每个模块都有自己的作用域,在模块中创建的任何声明,在模块外都不可见,除非他们被显示的导出。

使用另一个模块中的声明,也需要进行显示的导入操作。

导出

导出使用export关键字

导入

静态导入

导入声明分为两部分
导入路径:用于指定导入的模块
导入绑定:用于定义导入的模块中的可用实体集及使用形式

导入绑定

导入绑定可以有几种形式

假设模块具有路径./utils和导出实体XY

import * as Utils from './utils'

表示将路径中所有导出的实体都引入进来,并且设置了别名Utils,可以直接使用别名访问对应导出实体。

import {X, Y} from './utils'

引入实体X和Y,可在当前模块中直接使用X和Y

import {X as Z, Y} from './utils'

引入实体X和Y,同时对X设置了别名Z,此时在模块中可以直接使用Y和Z,但不能使用X,编译时会报错。

动态导入

import()语法通常称为动态导入,用来动态导入模块。以这种方式调用,将返回一个promise。

如下例所示,import(modulePath)可以加载模块并返回一个promise,该promise resolve为一个包含其所有导出的模块对象。该表达式可以在代码中的任意位置调用。

let modulePath = prompt("Which module to load?");
import(modulePath)
.then(obj => <module object>)
.catch(err => <loading error, e.g. if no such module>)

如果在异步函数中,可以使用let module = await import(modulePath)。

// say.ts
export function hi() {
  console.log('Hello');
}
export function bye() {
  console.log('Bye');
}

那么,可以像下面这样进行动态导入:

async function test() {
  let ns = await import('./say');
  let hi = ns.hi;
  let bye = ns.bye;
  hi();
  bye();
}

导入kit

从HarmonyOS NEXT Developer Preview 1版本开始引入Kit概念。SDK对同一个Kit下的接口模块进行了封装,开发者在示例代码中可通过导入Kit的方式来使用Kit所包含的接口能力。其中,Kit封装的接口模块可查看SDK目录下Kit子目录中各Kit的定义。

通过导入Kit方式使用开放能力有三种方式:

  • 方式一:导入Kit下单个模块的接口能力。例如:
    import { UIAbility } from '@kit.AbilityKit';
    
  • 方式二:导入Kit下多个模块的接口能力。例如:
    import { UIAbility, Ability, Context } from '@kit.AbilityKit';
    
  • 方式三:导入Kit包含的所有模块的接口能力。例如:
    import * as module from '@kit.AbilityKit';
    
    其中,“module”为别名,可自定义,然后通过该名称调用模块的接口。

特别注意:方式三可能会导入过多无需使用的模块,导致编译后的HAP包太大,占用过多资源,请谨慎使用。

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

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

相关文章

MySQL中的锁事

一、概述 锁是计算机在执行多线程或线程时用于并发访问同一共享资源时的同步机制&#xff0c;MySQL中的锁是在服务器层或者存储引擎层实现的&#xff0c;保证了数据访问的一致性与有效性。 事务的隔离性是由的锁来实现。 二、MySQL并发事务访问的问题 我们已经知道事务并发…

day-39 矩阵中的最大得分

思路 动态规划。利用一个二维数组记录对应位置可以达到的最高得分&#xff08;位置&#xff08;0,0&#xff09;不可能&#xff09;&#xff0c;然后找出最大值即可&#xff08;如果除了&#xff08;0,0&#xff09;上的值其他值都一样&#xff0c;则返回任意一个即可&#xff…

Python 3 入门基础知识 之数据容器及用法【2】 推荐

前面关于python的下载安装、如何定义变量&#xff0c;基本的数据类型&#xff0c;以及if条件语句、for循环语句&#xff0c;部分运算都进行了梳理总结。参考&#xff1a;Python 3 入门基础知识【1】数据类型 安装下载 推荐-CSDN博客 这里回顾一下python的数据容器基础知识&…

智能换热:图扑智慧供热可视化管理平台

图扑搭建智慧供热可视化管理平台&#xff0c;通过实时监控和数据分析提升运营效率&#xff0c;实现智能化管理&#xff0c;保障系统稳定与高效运行。

深挖Redis分布式缓存:你还在为缓存架构感到困惑吗?灵办AI为你揭开文献背后的秘密!

文章目录 1 灵办AI插件2 翻译~外文文献3 解释~文献标题分析4 文档解析~文献总结5 搜索~全网搜索总结6 总体评价~文献代码分析总结 本文将引用 Research and Application of Distributed Cache Based on Redis [1] 外文文献解读为案例进行剥削&#xff0c;进而提高对 Redis的分布…

相机光学(三十五)——三刺激值

0.参考链接 [1]三刺激值 [2]色差仪CIERGB和CIEXYZ光谱三刺激值区别 1.三刺激值的由来 根据杨-亥姆霍兹的三原色理论&#xff0c;色的感觉是由于三种原色光刺激的综合结果。在红、绿&#xff0c;蓝三原色系统中&#xff0c;红。绿、蓝的刺激量分别以R、G、B表示之。由于从实际…

安装开源软件ChatALL(齐叨)来聚合各大人工智能工具

安装开源软件ChatALL&#xff08;齐叨&#xff09;来聚合各大人工智能工具 前言 如果你跟我一样无论遇到什么问题都要询问人工智能&#xff0c;并且至少同时用4-5个公司的人工智能&#xff0c;选择一个最中意的结果 以前我都会用Chrome浏览器打开4个窗口&#xff0c;每个问题…

c语言中比较特殊的输入格式

目录 一.%[ ] 格式说明符 1.基本用法 (1)读取字母字符: (2)读取数字字符: (3)读取所有字符直到遇到空格: (4)读取直到换行符: 2.使用范围和组合: 3.^ 取反操作 4.注意事项 (1). 字符范围的正确表示 (2). 避免字符集中的特殊字符冲突 (3).避免空字符集 (4). 输入长…

C++竞赛初阶L1-11-第五单元-for循环(25~26课)510: T454422 均值

题目内容 给出一组样本数据&#xff0c;计算其均值。 输入格式 输入有两行&#xff0c;第一行包含一个整数&#xff0c;表示样本容量 n。 第二行包含 n 个浮点数 ai​&#xff0c;代表各个样本数据。 输出格式 输出一行&#xff0c;包含一个浮点数&#xff0c;表示均值。 …

TikTok爆款盘点-哪些产品会更受欢迎

海外短视频兴起&#xff0c;TikTok成为了国内企业出海最成功的APP。TikTok现在不仅是一个娱乐社交平台&#xff0c;也是一个强大的电商平台。如果出海卖家在选品上好好下功夫&#xff0c;利用TikTok这个营销工具&#xff0c;在海外也能获得不小的收益。 那么&#xff0c;TikTok…

网络协议十 应用层 SPDY / HTTP2 / QUIC / HTTP3

一 HTTP1.1 的不足 二 SPDY 协议 三 HTTP2 也只是需要在 server 端配置&#xff0c;不需要改动 服务器的代码。 HTTP2 可以看成是 将 SPDY 和 HTTP 融合在一起的改动 上面image sprites 的概念 HTTP2的问题--对头阻塞 和 握手延迟问题 引出的 QUIC 技术 由于传输层用的 TC…

node20+版本下hexo部署报错失败的解决办法

最近升级了node.js的版本&#xff0c;升到了最新的稳定版本v20.16.0&#xff0c;结果发现在该版本下hexo部署报错失败。本文记录了node20版本下hexo部署报错失败的解决办法。 一、报错信息 执行hexo的deploy部署命令 hexo d具体报错信息如下 INFO Deploying: git INFO Cl…

【大模型系列】更像人类行为的爬虫框架

随着大规模模型技术的兴起&#xff0c;我们可以看到百模大战、各种智能体、百花齐放的应用场景&#xff0c;那么作为一名前端开发者&#xff0c;以前端的视角&#xff0c;我们应当如何积极做好技术储备&#xff0c;开拓技术视野&#xff0c;在智能体时代保持一定的竞争力呢&…

webpack打包可视化分析之--webpack-bundle-analyzer

在开发一些项目的时候&#xff0c;有时候有些旧的框架项目用的webpacke打包慢&#xff0c;打包出来的包文件大&#xff0c;然而我们想要对它进行优化分析&#xff0c;有些旧的项目可能在不断迭代的过程中&#xff0c;有些模块功能改造或者有些需求变化&#xff0c;有些新需求模…

python的warnings.filterwarnings(“ignore“)

在python中运行代码经常会遇到的情况是——代码可以正常运行但是会提示警告&#xff0c;如果想要去掉这些警告&#xff0c;可以使用python的warnings.filterwarnings(“ignore”)函数。 代码&#xff1a; import warnings warnings.filterwarnings(ignore)看一下这个函数&…

【学习笔记】数据结构(五)

多维数组和广义表 文章目录 多维数组和广义表5.1 数组的定义5.2 数组的顺序表示和实现5.3 矩阵的压缩存储5.3.1 特殊矩阵5.3.2 稀疏矩阵三元组顺序表 (Triplet Representation) - 有序的双下标法行逻辑链接的顺序表十字链表法 5.4 广义表的定义5.5 广义表的存储结构5.6 m元多项…

mysql与Python交互

mysql数据库基本操作&#xff1a; [rootm ~]# tar -xf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz 解压压缩包 [rootm ~]# ls anaconda-ks.cfg mysql-5.7.44-linux-glibc2.12-x86_64 mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz [rootm ~]# cp -r mysql-5.7.44-linu…

【myz_tools】Python库 myz_tools:Python算法及文档自动化生成工具

写在前面 本来最开始只是单纯的想整理一下常用到的各类算法&#xff0c;还有一些辅助类的函数&#xff0c;方便时间短的情况下快速开发。后来发现整理成库更方便些&#xff0c;索性做成库&#xff0c;通过pip install 直接可以安装使用 关于库 平时见到的各类算法大多数还是…

volatile 浅谈

在Java中&#xff0c;volatile 关键字是一种轻量级的同步机制&#xff0c;它用于确保变量的可见性和有序性&#xff0c;但不保证原子性。当我们说 volatile 屏障时&#xff0c;我们实际上是在讨论 volatile 变量如何影响Java内存模型&#xff08;JMM&#xff09;中的操作重排序…

Vue3+vite+ts 项目使用mockjs

1、安装mockjs npm i mockjs 2、安装vite-plugin-mock npm i vite-plugin-mock -D 3、安装axios npm i axios 4.在src目录下创建mock文件夹,在文件夹内创建login.ts等文件&#xff0c;并在文件夹内放置以下内容&#xff08;注&#xff1a;URL要和真实请求地址保持一致&am…