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 + " " + y
console.log(z)
// 不需要return
}
vue data类型定义
<script lang="uts">
export default {
data() {
const date = new Date()
return {
s1 : "abc", // 根据字面量推导为string
n1 : 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) // 返回true
let myDate = new Date();
console.log(myDate instanceof Date) // 返回true
uni.request({
url: 'https://abc',
success: (data) => {
if (data.statusCode == 200) {
const result = data.data as UTSJSONObject
console.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)
js
和swift
的Array,是可变长的泛型Array。
而在kotlin
中,其自带的Array是不可变长的,即数组的length是固定的。只有ArrayList是可变长的。
为了拉齐实现,UTS补充了新的Array,替代kotlin的Array。它继承自kotlin的ArrayList,所以可以变长。
定义数组
- 字面量创建
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 转换 Array
let kotlinList = mutableListOf("hello","world")
let utsArr1 = Array.fromNative(kotlinList)
// kotlin.Array 转换 Array
let 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 转 专有数组类型