uniappx uts自学(2024/10/14)

server/2024/10/15 17:42:25/

uts需要类型

uts声明变量 let 或 const
let相当于 TypeScript 中的 let、kotlin 中的 var、swift 中的 var。
cosnt相当于 TypeScript 中的 const、kotlin 中的 val、swift 中的 let。

let [变量名] : [类型] = 值;

let str :string = "hello"; // 声明一个字符串变量
str = "hello world"; // 重新赋值
UTS 的类型有:
  • 基础类型:boolean、number、string、any、null,都是小写。前3个typeof返回类型名称,null的typeof是object,any的typeof是运行时值的类型。
  • 对象类型:Date、Array、Map、Set、UTSJSONObject,首字母大写。typeof返回"object",判断准确类型需使用 instanceof
  • 使用 type 来自定义类型
  • 特殊类型:function、class、error。
  • 平台专有类型:BigInt、Int、Float、Double、NSString、kotlin.Array...
方法参数及返回值类型定义
function test(score: number): boolean {return (score>=60)
}
test(61) // 返回true
//无返回值得时候
function add(x :string, y :string) :void {let z :string = x + " " + yconsole.log(z)// 不需要return
}
vue data类型定义
<script lang="uts">export default {data() {const date = new Date()return {s1 : "abc", // 根据字面量推导为stringn1 : 0 as number, // 这里其实可以根据字面量自动推导,as number写不写都行n2, // 不合法,必须指定类型n3 as number, // 不合法,uts不支持undefined,必须通过冒号初始化赋值,哪怕赋值为null,见下n4 : null as number | null // 合法。定义为可为null的数字,初始值是null,但在使用n4前必须为其赋值数字。(number | null)是一个或的写法,前后顺序没有关系。uts的联合类型只支持 |null 。year: date.getFullYear() as number, // 在data里,目前无法通过变量类型推导data项的类型,需使用 as 显式声明类型为number}}}
</script>
类型判断
判断类型,有好几种方案:typeof、instanceof、isArray。
typeof(true) == "boolean"
typeof("abc") == "string"let n1 : number = 1
typeof(n1) == "number"const a1 = ["uni-app", "uniCloud", "HBuilder"]
console.log(Array.isArray(a1)) // 返回true
console.log(a1 instanceof Array) // 返回truelet myDate = new Date();
console.log(myDate instanceof Date) // 返回trueuni.request({url: 'https://abc',success: (data) => {if (data.statusCode == 200) {const result = data.data as UTSJSONObjectconsole.log(result instanceof UTSJSONObject) //返回true}},fail: () => {console.log('fail');}
});

安全调用 js没有类型检查,ust和ts都有严格的类型检查

//对于可为null的类型,调用时需要加问号,否则编译器会报错。
const s: string | null = null // s为一个可为null的字符串
console.log(s?.length) //除非前面已经给s赋值,否则调用s的方法和属性必须加?
除了变量,类型的属性也可以为null。此时可以和变量一样使用 | null,还可以用?:来代表可选
type obj = {id : number,name : string,age : number | null,sex ?: boolean
}
1. 代码中判空后再使用
if (b != null) {console.log(b.length) //返回3
}
2. 不判空,使用?.进行安全调用
const a = "uts"
const b: string | null = null
console.log(a.length) // a是明确的string类型,它的属性可以直接调用,无需安全调用
console.log(b?.length) // b可能为null,null没有length属性,在没有判空时,.操作符前面必须加?标记
空值合并
//空值合并运算符(??)是一个逻辑运算符,当左侧的操作数为 null 时,返回其右侧操作数,否则返回左侧操作数。
const foo = null ?? 'default string';
console.log(foo);
// Expected output: "default string"const baz = 0 ?? 42;
console.log(baz);
// Expected output: 0
非空断言
非空断言运算符(!)将任何值转换为非空类型。可以写 b! ,这会返回一个非空的 b 值(例如:在我们示例中的 string)或者如果 b 为 null,就会抛出一个异常。
//
const l = b!.length

vue data中null的用法

//很多时候,data的数据需要通过script获取,而 uts 编译为非js时不支持 undefined,初始化时就只能赋null。一旦定义可为null后,调用时就需要用?.操作可选属性。
<script lang=uts>type PersonType = {id: number,name: string,age: number}export default {data() {return {person: null as PersonType | null,}},onLoad() {this.person = JSON.parse<PersonType>(`{"id": 1,"name": "zhangsan","age": 18}`)console.log(this.person?.name);}}
</script>

非常重要-数组(Array)

jsswift的Array,是可变长的泛型Array。

而在kotlin中,其自带的Array是不可变长的,即数组的length是固定的。只有ArrayList是可变长的。

为了拉齐实现,UTS补充了新的Array,替代kotlin的Array。它继承自kotlin的ArrayList,所以可以变长。

定义数组

  1. 字面量创建
let a1 = [1,2,3];//支持
let a2 = [1,'2',3];//支持// 需要注意的是,字面量创建的数组,不支持出现空的缺省元素
let a3 = [1,,2,3];//不支持
如果想定义一个空数组,则不能依赖编译器的自动推导,需显式声明空数组的类型。见下
2.使用:Array<>定义数组项的类型
const a1:Array<string> = ["uni-app", "uniCloud", "HBuilder"] //表示数组内容都是string。如不能确定可以写Array<any>
let a2:Array<number> = []; //定义一个数字类型的空数组
 3.使用[]定义数组项的类型
const a1: string[] = ['a', 'b', 'c']; //表示数组内容都是string
4.创建数组对象
let a1 = new Array(1,2,3);//支持
let a2 = new Array(1,'2',3);//安卓平台支持, iOS 平台不支持,在 iOS 中创建 Any[] 数组请直接使用数组字面量,如 let a2 = [1. '2', 3]
let a3 = Array(1,2,3);//支持
let a4 = Array(1,'2','3');//安卓平台支持, iOS 平台不支持,在 iOS 中创建 Any[] 数组请直接使用数组字面量,如 let a4 = [1,'2','3']
5 uvue的data定义数组
export default {data() {return {listdata: [] as Array<UTSJSONObject>,}}
}

字面量创建的数组,在uts的老版本上,kotlin自动推导数组类型时,可能会推导成intArray,而不是uts的array。建议显式声明类型。

typeof 一个 array 得到的是 object。需使用 Array.isArray 或 instanceof 来判断数组类型。

let a1 = [1,2,3]
console.log(Array.isArray(a1)) // 返回true
console.log(a1 instanceof Array) // 返回true

遍历数组对象

const array1: string[] = ['a', 'b', 'c'];
array1.forEach((element:string, index:number) => {console.log(element)console.log(array1[index]) //与上一行代码等价
});
// 打印结果是 a a b b c c

平台专有数组类型

#kotlin专有数组类型
  • 专有数组类型清单

    • kotlin.collections.List
    • kotlin.Array
    • kotlin.IntArray
    • kotlin.FloatArray
    • kotlin.ByteArray
    • kotlin.LongArray
    • kotlin.CharArray
    • ...
  • 专有数组类型定义方式

// kotlin.collections.List
let kotlinList= mutableListOf("hello","world")
// kotlin.Array
let kotlinArray = arrayOf("hello","world")
  • 专有数组类型 转 Array
// kotlin.collections.List 转换 Arraylet kotlinList = mutableListOf("hello","world")let utsArr1 = Array.fromNative(kotlinList)// kotlin.Array 转换 Arraylet kotlinArray = arrayOf("hello","world")let utsArr2 = Array.fromNative(kotlinArray)//ByteArray 即 java 中的 byte[]   需要HBuilderX 3.9.0 之后版本let b1 = byteArrayOf(-1,2,0,3,4,5)let c1 = Array.fromNative(b1)//LongArray 即 java 中的 long[]  需要HBuilderX 3.9.0 之后版本let b2 = longArrayOf(-1,2,0,3,4,5)let c2 = Array.fromNative(b2)//ShortArray 即 java 中的 short[] 需要HBuilderX 3.9.0 之后版本let b3 = shortArrayOf(-1,2,0,3,4,5)let c3 = Array.fromNative(b3)//IntArray 即 java 中的 int[]let b4 = intArrayOf(-1,2,0,3,4,5)let c4 = Array.fromNative(b4)// kotlin.CharArray 即 java 中的 char[]let b5 = charArrayOf(Char(66),Char(66),Char(81))let c5 = Array.fromNative(b5)

下一节为

  • Array 转 专有数组类型

http://www.ppmy.cn/server/132290.html

相关文章

Spring Boot学习资源库:Java开发者的新篇章

2 相关技术简介 2.1Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xff0c;任…

几种常用大模型工具生成基于hi3861的OpenHarmony代码的尝试

引言 最近在上智能物联网的课程&#xff0c;讲授基于hi3861的OpenHarmony编程&#xff0c;所以尝试一下使用大模型工具生成相关的代码&#xff0c;看看效果如何。提问的方式比较简单粗暴&#xff1a; 在OpenHarmony的hi3861平台上&#xff0c;如何编程访问https的网站&#xf…

力扣 前缀和

找子数组的个数了解前缀和的基础。 前缀和大致理解为到达某个位置&#xff0c;前面几个数的总和&#xff0c;即s[i1]s[i]a[i1]&#xff0c;可以通过一次循环获得。然后几个前缀和作差&#xff0c;即可得到某个位置到某个位置的和&#xff0c;根据map的键值对进行更新次数。 题…

什么是智能合约?

什么是智能合约&#xff1f; 智能合约&#xff0c;就是一段写在区块链上的代码&#xff0c;一旦某个事件触发合约中的条款&#xff0c;代码即自动执行。也就是说&#xff0c;满足条件就执行&#xff0c;不需要人为操控、不需要第三方信任。区块链的安全性和不可篡改性&#xf…

股指期货和股指期权有什么区别?

在金融衍生品的世界里&#xff0c;股权类衍生品无疑是其中的佼佼者&#xff0c;而股指期货和股指期权更是其中的佼佼者。尽管它们之间有着千丝万缕的联系&#xff0c;但它们之间的区别同样不容忽视。本文衍生股指君将详细解析股指期货和股指期权的核心区别。 一、交易的东西不…

VUE项目基于源码实现可视化编程技术的探索

背景 在面对大型且高度组件化的项目时&#xff0c;传统的开发模式——即边预览边手动修改代码&#xff0c;往往会因项目结构的复杂性而显得效率低下&#xff0c;尤其是对于新加入项目或对项目结构不够熟悉的开发者而言&#xff0c;从UI界面逆向定位到具体代码实现并作出修改的过…

02.06、回文链表

02.06、[简单] 回文链表 1、题目描述 编写一个函数&#xff0c;检查输入的链表是否是回文的。 2、解题思路&#xff1a; 快慢指针找中点&#xff1a; 利用快慢指针的技巧来找到链表的中间节点。慢指针 slow 每次移动一步&#xff0c;而快指针 fast 每次移动两步。这样&…

【git】git add时warning:LF will replaced by CRLF

git add时warning&#xff1a;LF will replaced by CRLF 一&#xff0c;问题现象二&#xff0c;问题原因&解决方法 一&#xff0c;问题现象 二&#xff0c;问题原因&解决方法 这个警告的原因是 Git 在进行文件添加操作时&#xff0c;发现行尾结束符不一致。 在不同的…