object.md 2.7 KB
Newer Older
Q
qiang 已提交
1 2 3 4 5 6 7 8
# 对象类型(Object Types)

UTS 语言支持使用对象字面量(Object Literal)声明类型,但不支持任意位置直接使用匿名对象类型,需要先为对象类型命名。

## 定义类型

使用 [type](./type-aliases.md) 关键字为对象类型命名,命名后可在其他位置使用此别名。

Q
qiang 已提交
9
支持的用法:
Q
qiang 已提交
10 11 12 13

```ts
type Person = {
    name: string
Q
qiang 已提交
14
    printName: () => void
Q
qiang 已提交
15 16 17 18 19 20 21
}
 
function greet(person: Person) {
    // ...
}
```

Q
qiang 已提交
22
未支持的用法:
Q
qiang 已提交
23 24

```ts
Q
qiang 已提交
25
function greet(person: { name: string, printName: () => void }) {
Q
qiang 已提交
26 27 28 29 30 31 32 33
    // ...
}
```

## 实例化

使用 [type](./type-aliases.md) 为对象类型命名实际上编译器会自动创建对应名称的 [Class](./class.md),使用 `as` 关键字将对象字面量的值与类型相关联,编译器会自动创建对应类型的实例。

Q
qiang 已提交
34
正确的用法:
Q
qiang 已提交
35 36

```ts
Q
qiang 已提交
37
greet({ name: 'Tom', printName: function () { console.log(this.name) } } as Person)
Q
qiang 已提交
38 39
```

Q
qiang 已提交
40
类型不匹配:
Q
qiang 已提交
41 42

```ts
Q
qiang 已提交
43
greet({ name: 'Tom', printName: function () { console.log(this.name) } })
Q
qiang 已提交
44 45 46 47
```

## 嵌套限制

Q
qiang 已提交
48
定义时对象字面量仅支持一层,嵌套多层的对象字面量需要手动分解为多个类型分别定义。
Q
qiang 已提交
49

Q
qiang 已提交
50
支持的用法:
Q
qiang 已提交
51 52 53 54 55 56 57 58 59 60 61 62

```ts
type PersonInfo = {
    age: number
}

type Person = {
    name: string
    info: PersonInfo
}
```

Q
qiang 已提交
63
未支持的用法:
Q
qiang 已提交
64 65 66 67 68 69 70 71 72 73

```ts
type Person = {
    name: string
    info: {
        age: number
    }
}
```

Q
qiang 已提交
74
 HBuilderX 3.9 版本之前实例化的时候也需要逐级绑定类型
Q
qiang 已提交
75

Q
qiang 已提交
76
支持的用法:
Q
qiang 已提交
77 78 79 80 81 82 83 84 85 86

```ts
const person = {
    name: 'Tom',
    info: {
        age: 18
    } as PersonInfo
} as Person
```

Q
qiang 已提交
87
HBuilderX 3.9 版本之前未支持的用法:
Q
qiang 已提交
88 89 90 91 92 93 94 95 96 97

```ts
const person = {
    name: 'Tom',
    info: {
        age: 18
    }
} as Person
```

Q
qiang 已提交
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
## 顺序限制

在函数作用域内定义时需要注意按顺序声明

支持的写法:

```ts
function test() {
    type PersonInfo = {
        age: number
    }

    type Person = {
        name: string
        info: PersonInfo
    }
}
```

不支持的写法:

```ts
function test() {
    type Person = {
        name: string
        info: PersonInfo
    }

    type PersonInfo = {
        age: number
    }
}
```

Q
qiang 已提交
132 133 134 135 136 137 138
## 匿名对象(Anonymous Object)@anonymous-object

UTS 语言虽然不支持匿名对象类型声明,但是支持匿名的对象字面量作为值使用。匿名的对象字面量作为值使用时,编译器会自动将其初始化为 [UTSJSONObject](./buildin-object-api/utsjsonobject.md) 类型的实例。

```ts
const person: UTSJSONObject = {
    name: 'Tom',
Q
qiang 已提交
139 140 141
    printName: () => {
      // ...
    }
Q
qiang 已提交
142 143 144 145 146 147 148 149 150
}
```

```ts
function printName(obj: UTSJSONObject) {
    console.log(obj['name'])
}

printName({
Q
qiang 已提交
151
    name: 'Tom'
Q
qiang 已提交
152 153
})
```