English
UTS 语言支持使用对象字面量(Object Literal)声明类型,但不支持任意位置直接使用匿名对象类型,需要先为对象类型命名。
使用 type 关键字为对象类型命名,命名后可在其他位置使用此别名。
支持的用法:
type Person = {
name: string
fn: () => void
}
function greet(person: Person) {
// ...
}
未支持的用法:
function greet(person: { name: string, fn: () => void }) {
// ...
}
使用 type 为对象类型命名实际上编译器会自动创建对应名称的 Class,使用 as
关键字将对象字面量的值与类型相关联,编译器会自动创建对应类型的实例。
正确的用法:
greet({ name: 'Tom', fn: function () { } } as Person)
类型不匹配:
greet({ name: 'Tom', fn: function () { } })
定义时对象字面量仅支持一层,嵌套多层的对象字面量需要手动分解为多个类型分别定义。
支持的用法:
type PersonInfo = {
age: number
}
type Person = {
name: string
info: PersonInfo
}
未支持的用法:
type Person = {
name: string
info: {
age: number
}
}
HBuilderX 3.9 版本之前实例化的时候也需要逐级绑定类型
支持的用法:
const person = {
name: 'Tom',
info: {
age: 18
} as PersonInfo
} as Person
HBuilderX 3.9 版本之前未支持的用法:
const person = {
name: 'Tom',
info: {
age: 18
}
} as Person
在函数作用域内定义时需要注意按顺序声明
支持的写法:
function test() {
type PersonInfo = {
age: number
}
type Person = {
name: string
info: PersonInfo
}
}
不支持的写法:
function test() {
type Person = {
name: string
info: PersonInfo
}
type PersonInfo = {
age: number
}
}
UTS 语言虽然不支持匿名对象类型声明,但是支持匿名的对象字面量作为值使用。匿名的对象字面量作为值使用时,编译器会自动将其初始化为 UTSJSONObject 类型的实例。
const person: UTSJSONObject = {
name: 'Tom',
fn: () => {
// ...
}
}
function printName(obj: UTSJSONObject) {
console.log(obj['name'])
}
printName({
name: 'Tom'
})