HarmonyOS入门-ArkTS学习(一)

1. 什么是ArkTS语言

学习之前,我们先初步了解下什么是ArkTS

官方指南这样介绍:

ArkTS是TS的超集,ArkTS定义了声明式UI描述、自定义组件和动态扩展UI元素的能力,再配合ArkUI开发框架中的系统组件及其相关的事件方法、属性方法等共同构成了UI开发的主体。

起初看这个,“ArkTs是TS超集,且它配合ArkUI框架等共同构成UI开发主体。”简单的我会认为ArkTS+ArkUI就类似于Android中的Kotlin+Compose,一个是语言负责逻辑部分,一个是绘制UI的,是单独的两部分,但是实际发现并不是这样的。

因为它又介绍了一张图,如下所示,并介绍说这是ArkTS的基本组成,看到这我就懵了,按照Android的理解,这个不是类似Compose的UI框架绘制的页面么,转换为鸿蒙这边不是应该叫ArkUI吗,怎么说是ArkTS的基本组成,难道是他写错了?

请添加图片描述

但是打开一个项目后,发现并不是这样。这个Column位于ArkTS依赖包中的component文件夹内,而另一个api文件夹,包含的内容有类似Android的通知、Activity等这些东西。

image-20240327101629285

api文件夹展开如下

image-20240327101629285

官方将ArkTS的划分如下图所示

image-20240327101629285

综合上面的介绍,我们将这张图可以简单地画为下面这张,就很好理解了。

image-20240327101629285

那这样,我们对于ArkTS的学习就分为这几部分TypeScript+UI+(通知、媒体、动画、网络等)

2. ArkTS中的TypeScript

虽然我也没接触过前端,没接触过TypeScript,但是你学过Kotlin的话,会发现这两种语言还是挺像的。语言只是工具,大多数语言只是换了种说法或者单词,别因为害怕接触新的语言而停在了接触新事物的第一步。废话不多想,接下来我们学习点TypeScript基础知识,足够鸿蒙开发入门,高阶的可以日后学习。

注意: 虽然ArkTS是TypeScript的超集,但是出于性能考虑,TypeScript的部分内容ArkTS是不被支持的。

2.1 变量/基本数据类型

2.1.1 变量

Kotlin和TypeScript一样有类型推导机制

Kotlin

Kotlin声明变量用varvalvar声明的变量值可变,val声明的值不可变。

var a:Int= 1 	
a=2val b=1		//Kotlin可以推导出b为Int类型
b=2  ×

TypeScript

TypeScript声明变量用varletconstvarlet声明的变量值可变,const声明的值不可变。

但是var在ArkTS中被禁止了,看下面这个例子,了解下varlet的不同点

  • var关键字声明的变量是函数作用域的
    let声明的变量是块级作用域的。let声明的变量只在其包含的块(如函数、if else块或循环块)中可见。

    // 使用 var 声明变量
    for(var i = 0; i < 5; i++){console.log(i);
    }
    console.log(i); // 输出: 5
    
    // 使用 let 声明变量
    for(let j = 0; j < 5; j++){console.log(j);
    }
    console.log(j); // 编译错误: 无法找到名称 'j'    
    

    如果你学过Java、kotlin等语言的话,对于第一个循环,你可能会疑惑这个var定义的i不应该只在这个for循环内生效可以使用,怎么在外面还能访问,但是因为var变量是函数作用域,所以在外面也能访问到

    使用let声明的j就和java等语言的作用域一样。

  • var可以重复声明变量,let不可以

    var nun=1
    var num=2
    console.log(num) //输出2let s=1
    let s=1
    console.log(s) // 编译错误:不能重复声明变量s
    

综上,TypeScript中的let就相当于Kotlin中的var,而const就相当于Kotlin中的val,这个TypeScript中的var记不住也没关系,我们不用记那么多,因为它在ArkTS中被禁止了。

2.1.2 基本数据类型

TypeScript说明Kotlin说明
number数字,支持整型还浮点型Int整型
Long长整型
Short短整型
Float单精度浮点型
Double浮点型
boolean布尔类型Boolean布尔类型
string字符串类型,用单引号 ' 或双引号 " 括起来String字符串类型
any任意类型Any
void空类型,代表函数不返回值void空类型
symbol符号类型,表示唯一的符号值,通常用于创建对象的唯一键

2.2 数组集合

TypeScript创建数组

1、使用类型推断创建

let arr=[1,2,3]

2、指定数组元素类型创建

let arr:number[]=[1,2,3]

3、用 constructor 创建数组

let arr=new Array(1,2,3)

4、从已有数组创建

let otherArray=new Array(1,2,3)
let arr=[...otherArray]		//...相当于将otherArray展开
console.log(arr)			//输出:[1, 2, 3] 

而Kotlin是使用如下方式来创建数组的

val arr = arrayOf(1,2,3)
val arr2 = intArrayOf(1,2,3)
val arr3 = arrayListOf<String>()
val arr4 = arrayOfNulls<Int>(3)

2.3函数

Kotlin使用fun修饰,TypeScript使用function修饰

//kotlin
fun add(x:Number,y:Number){}
//TypeScript
function add(x:number,y:number){}

2.3.1可选参数

//kotlin 
fun add(a:Number,b:Number?)
//TypeScript
function add(a:number,b?:number)

kotlin在类型后面加?而TS在前加?

2.3.2剩余参数

//kotiln
fun test(a:String,vararg params:String,c:Int){for (param in params ){Log.i("test", "test: $i")}
}

Kotlin,使用vararg来修饰,这个params为多个参数,所以可以进行循环输出。

//typescript
//数组类型的剩余参数
function test(...params:string[]){
}
//元组类型的剩余参数
function test(...args: [boolean, number]) {}

TypeScript中的剩余参数,string后面使用数组类型

2.3.3返回值类型

//kotlin
fun add(a:Number,b:Number):Number{return a.toDouble()+b.toDouble()
}
//typescript
function add(a:number,b:number):number{return a+b
}
//或者
function add(a:number,b:number){return a+b
}

在大多数情况下,TypeScript能根据return语句等自动推断出返回值类型,因此也可以省略返回值类型。

2.3.4箭头函数(类似kotlin中用lambda表示的匿名函数)

匿名函数的语法与常规函数相似,但没有函数名。它可以具有参数列表、返回类型和函数体,并且可以按需求进行定义

//kotlin 匿名函数
val sum = fun(a: Int, b: Int): Int {return a + b
}
val result = sum(5, 10)
//kotlin用Lambda表达式实现类似功能
val sum:(Int,Int)->Int={a,b->a+b}
//typescript 匿名函数
const sum = function(a:number,b:number):number{return a+b
}
//箭头函数
const sum = (a:number,b:number):number=>a+b

2.4条件语句

2.4.1 if else

TypeScript和Kotlin的用于一致

//kotlin
var num:Int = 12
if (num % 2==0) {Log.i(TAG, "偶数")
} else {Log.i(TAG, "奇数")
}
//typescript
var num:number = 12
if (num % 2==0) {console.log('偶数')
} else {console.log('奇数')
}

2.4.2 switch…case

TypeScript和Java用法一致,Kotlin中没有switch…case语句

//typescript
var grade = "A"
switch (grade) {case "A": {console.log('A')}case "B": {console.log('B')}default: {console.log('不合格')}
}
//kotlin
val grade="A"
when(grade){"A"->{Log.i(TAG, "优")}"B"->{Log.i(TAG, "B")}else->{Log.i(TAG, "不及格")}
}

2.5 循环语句

//kotlin
val array= listOf("a","b","c","d","e")
for (value in array){Log.i(TAG, "$value")
}
for (index in array.indices){Log.i(TAG, "${array[index]}")
}

在kotiln中我们是用for ...in 来循环,其中用array或者array.indices来区分是迭代下标还是值

但在typescript中,用for..infor..of来区分

//typescript
let list = [4, 5, 6];for (let i in list) {console.log(i); // "0", "1", "2"	迭代的是数组下标	
}for (let i of list) {console.log(i); // "4", "5", "6"	迭代的是数组值
}

for..offor..in均可迭代一个列表,但是用于迭代的值却不同:for..in迭代的是对象的键,而for..of则迭代的是对象的值。

2.6 类

2.6.1 定义

TypeScript定义类的方式和Kotlin一样

//kotlin
class Person {private val name: String = ""private val age: Number = 0
}//实例化
val p = Person()
//typescript
class Person {private name: stringprivate age: numberconstructor(name: string, age: number) {this.name = name;this.age = age;}public getPersonInfo(): string {return `My name is ${this.name} and age is ${this.age}`;}
}//实例化 和Java一样,需要使用new关键字
let p = new Person("张三",18)

2.6.2 继承

kotlin的继承,需要将父类open后才可继承,而Typescript的继承,和java一样,是使用extends关键字

//kotlin
open class Person {...
}class Student : Person() {var sno = ""var grade = 0
}
//typescript
class Student extends Person {private sno: stringprivate grade: numberconstructor(name:string,age:number,sno:string,grade:number){super(name,age)this.sno=snothis.grade=grade}}

2.6.3 构造函数

//typescript
class Person {private name: stringprivate age: numberconstructor(name: string, age: number) {this.name = name;this.age = age;}
}

TypeScript构造函数使用constructor关键字,且定义的变量必须初始化。可以private name: string="参数"或者在构造函数中赋值

通过以上学习,我们学习了TypeScript中最主要的知识,包括变量和函数、逻辑控制语句等,这些已经够我们开始来学习鸿蒙开发了,从下一篇开始,我们将开始学习ArkTS中的UI绘制部分。

请添加图片描述

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

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

相关文章

2024.2.26力扣每日一题——二叉搜索树的范围和

2024.2.26 题目来源我的题解方法一 深度搜索&#xff08;中序遍历&#xff09;方法二 广度搜索&#xff08;层序遍历&#xff09; 题目来源 力扣每日一题&#xff1b;题序&#xff1a;938 我的题解 方法一 深度搜索&#xff08;中序遍历&#xff09; 利用二叉搜索树中序遍历…

Python:使用Cator实现mysql数据库的CURD简化操作

目录 简介安装使用示例1、获取Database 对象2、Database对象3、Table操作 支持的占位符显示sql日志注意问题 Github: https://github.com/mouday/catorPypi: https://pypi.org/project/catorgitee: https://gitee.com/mouday/cator 简介 支持 mysql和sqlite数据库, 在现有连接…

OpenHarmony实战:轻量级系统之子系统移植概述

OpenHarmony系统功能按照“系统 > 子系统 > 部件”逐级展开&#xff0c;支持根据实际需求裁剪某些非必要的部件&#xff0c;本文以部分子系统、部件为例进行介绍。若想使用OpenHarmony系统的能力&#xff0c;需要对相应子系统进行适配。 OpenHarmony芯片适配常见子系统列…

留学生在美国大学利用AI工具到底算不算作弊呢?

自2022年以来&#xff0c;美国大学就开启了一场AI作弊与反作弊大战 战场小至测验&#xff0c;大至申请 这场战争并没有一方胜利&#xff0c;作弊者心思费尽 校方反作弊弄得教授们苦不堪言 那么作为中国留学生该如何避免这场战役呢&#xff1f; 毕竟还是学业要紧呢…… 故事…

软考 系统架构设计师系列知识点之软件架构风格(10)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之软件架构风格&#xff08;9&#xff09; 所属章节&#xff1a; 第7章. 系统架构设计基础知识 第3节. 软件架构风格 相关试题 7. 某企业内部现有的主要业务功能已封装成为Web服务。为了拓展业务范围&#xff0c;需要将…

让六西格玛培训有效的三个步骤,拿走不谢!

近年来&#xff0c;六西格玛作为一种先进的质量管理方法&#xff0c;被众多企业视为提升产品质量、优化流程、减少浪费的利器。然而&#xff0c;如何使六西格玛培训真正落地生根&#xff0c;发挥出其应有的效果&#xff0c;成为了许多企业关注的焦点。本文&#xff0c;天行健Si…

docker容器部署gitlab的runner的shell模式注册下job中无法使用docker指令

引言 现需通过gitlab-runner来构建jar部署的镜像,发现在job中无法使用docker指令,解决的过程中出现一系列异常,在此做个问题解决的记录。 内容 通过docker-compose部署 name: java-env services:env-gitlab-runner:restart: alwaysimage: env/gitlab-runner-java:latest…

每日五道java面试题之消息中间件MQ篇(二)

目录&#xff1a; 第一题. RabbitMQ的工作模式第二题. 如何保证RabbitMQ消息的顺序性&#xff1f;第三题. 消息如何分发&#xff1f;第四题. 消息怎么路由&#xff1f;第五题. 如何保证消息不被重复消费&#xff1f;或者说&#xff0c;如何保证消息消费时的幂等性&#xff1f; …

前端导出文本内容为csv文件,excel乱码

原因&#xff1a;编码格式问题&#xff0c;需要改为utf-8 bom // Create blob with utf8-bom 编码 const createBlobWithBOM(data, mimeType)> {const bom [0xEF, 0xBB, 0xBF];const bomArray new Uint8Array(bom);const dataArray new TextEncoder().encode(data);const…

Android adb ime 调试输入法

目录 前言列出所有输入法仅列出输入法 id列出所有输入法的所有信息 启用/禁用 输入法启用输入法禁用输入法 切换输入法还原输入法 前言 安装多个输入法后&#xff0c;可以在设置里进行切换。 既然是开发&#xff0c;能用命令就就命令~ ime 帮助说明&#xff1a; ime <c…

目标检测、识别和语义分割的标注工具安装

计算机视觉 图像分类&#xff08;目标检测&#xff09;&#xff1a;一张图像中是否含某种物体物体定位&#xff08;目标检测与目标识别&#xff09;&#xff1a;确定目标位置和所属类别。语义分割&#xff08;目标分割和目标分类&#xff09;&#xff1a;对图像进行像素级分类…

计算机视觉无人驾驶技术:入门指南

I. 引言&#xff1a; 计算机视觉无人驾驶技术是一种基于计算机视觉和机器学习技术的自动化驾驶技术。它可以通过搭载各种传感器和摄像机&#xff0c;让车辆自主感知周围环境&#xff0c;实现尽可能自动化的驾驶操作。 这种技术具有重要性和优势&#xff0c;包括&#xff1a; …

js 本地缓存localStorage和sessionStorage 还有cookie 用法和区别

一、定义和使用 localStorage 和 sessionStorage 属性允许在浏览器中存储 key/value 对的数据。 localStorage 用于长久保存整个网站的数据&#xff0c;保存的数据没有过期时间&#xff0c;直到手动去删除。 sessionStorage 数据保存在当前会话中&#xff0c;该数据对象临时保…

Mini-React

jsx jsx 是React中对于JavaScript的语法扩展&#xff0c;允许在JavaScript中去写类似于HTML的代码。使得开发者能够以一种更直观和声明式的方式去编写用户界面 vdom vdom是React为了提高性能而去引入的一个虚拟的dom表示。 它是一个轻量级的 JavaScript 对象&#xff0c;用于…

推荐算法策略需求-rank model优化

1.pred_oobe (base) [rusxx]$ pwd /home/disk2/data/xx/icode/baidu/oxygen/rus-pipeline/pipeline-migrate/UserBaseActiveStatPipeline/his_session (base) [rusxx]$ sh test.sh 2. user_skill_history_dict_expt2包含userid [workxx]$ vim /home/work/xx/du-rus/du_rus_o…

Python 之 Flask 框架学习

毕业那会使用过这个轻量级的框架&#xff0c;最近再来回看一下&#xff0c;依赖相关的就不多说了&#xff0c;直接从例子开始。下面示例中的 html 模板&#xff0c;千万记得要放到 templates 目录下。 快速启动 hello world from flask import Flask, jsonify, url_forapp F…

Redis集群的方案

文章目录 主从同步哨兵模式 在Redis中提供的集群方案总共有三种&#xff1a;主从同步、哨兵模式、Redis分片集群 主从同步 主从解决的是高并发问题。 单个Redis节点的并发能力有限&#xff0c;要进一步提高Redis的并发能力&#xff0c;可以搭建主从集群&#xff0c;实现读写分…

【edge浏览器无法登录某些网站,以及迅雷插件无法生效的解决办法】

edge浏览器无法登录某些网站&#xff0c;以及迅雷插件无法生效的解决办法 edge浏览器无法登录某些网站&#xff0c;但chrome浏览器可以登录浏览器插件无法使用&#xff0c;比如迅雷如果重装插件重装浏览器重装迅雷后仍然出现问题 edge浏览器无法登录某些网站&#xff0c;但chro…

基于FPGA的SPI_FLASH程序设计

SPI_FLASH简介 spi_flash是一种通用存储器&#xff0c;也称为SPI NOR Flash或SPI Flash。它使用SPI&#xff08;Serial Peripheral Interface&#xff09;接口进行通信&#xff0c;可以通过串行方式读写数据。spi_flash的特点是工作电压低&#xff0c;体积小&#xff0c;读写速…

设计模式之旅:工厂模式全方位解析

简介 设计模式中与工厂模式相关的主要有三种&#xff0c;它们分别是&#xff1a; 简单工厂模式&#xff08;Simple Factory&#xff09;&#xff1a;这不是GoF&#xff08;四人帮&#xff0c;设计模式的开创者&#xff09;定义的标准模式&#xff0c;但被广泛认为是工厂模式的…