原始类型子集 一般作为联合类型使用
某些情况下将变量类型推导为字面量类型
i 是 string
let i = 'xxx'
i 是 xxx 字面量
const i = 'xxx'
可以实现互斥属性
interface Tmp {
user:
| {
vip: true
expires: string
}
| {
vip: false
promotion: string
}
}
declare var tmp: Tmp
if (tmp.user.vip) {
console.log(tmp.user.expires)
}
对象类型的扩展
那么没有使用延迟求值的枚举成员必须放在使用常量枚举值声明的成员之后
const returnNum = () => 100 + 499
enum Items {
Foo = returnNum(),
Bar = 599,
Baz,
}
对象是单向映射的,我们只能从键映射到键值。而枚举是双向映射的,即你可以从枚举成员映射到枚举值,也可以从枚举值映射到枚举成员
仅有值为数字的枚举成员才能够进行这样的双向枚举,字符串枚举成员仍然只会进行单次映射
enum Items {
Foo,
Bar,
Baz,
}
const fooValue = Items.Foo // 0
const fooKey = Items[0] // "Foo"
因为数字枚举的编译结果进行了两次赋值
'use strict'
var Items
;(function (Items) {
Items[(Items['Foo'] = 0)] = 'Foo'
Items[(Items['Bar'] = 1)] = 'Bar'
Items[(Items['Baz'] = 2)] = 'Baz'
})(Items || (Items = {}))
Items 值为{0: 'Foo', 1: 'Bar', 2: 'Baz', Foo: 0, Bar: 1, Baz: 2}
只能通过枚举成员访问枚举值,而不能通过值访问成员
const enum Items {
Foo,
Bar,
Baz,
}
const fooValue = Items.Foo // 0
const fooKey = Items[0] // 无法访问