# 对象类型(Object Types)

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
    }
}

# 匿名对象(Anonymous Object)

UTS 语言虽然不支持匿名对象类型声明,但是支持匿名的对象字面量作为值使用。匿名的对象字面量作为值使用时,编译器会自动将其初始化为 UTSJSONObject 类型的实例。

const person: UTSJSONObject = {
    name: 'Tom',
    fn: () => {
      // ...
    }
}
function printName(obj: UTSJSONObject) {
    console.log(obj['name'])
}

printName({
    name: 'Tom'
})