type a = 'base' | 'delete' | string
type b = 'base' | 'delete' | (string & {})
let c:a =
let d:b =
如果使用了 a 类型,那么当设置 c 的等号后, 是无法触发 'base' | 'delete' 的提示的,因为类型被 string 覆盖了。但是如果使用的是 b 的类型设置,可以触发 'base' | 'delete' 的类型提示,当然依然可以设置为 string 类型。string & {} 这样的实现效果应该如何理解?
type a = 'base' | 'delete' | string 所示。这意味着 a 类型可以是 'base' 或 'delete',也可以是任意字符串 string。
交叉类型(&)可以将多个类型合并为一个类型,并包含其中所有属性和方法。使用交叉类型后,string & {} 的实现相当于一个空接口类型,它可以保留原有类型的特性,同时又使联合类型中的字符串字面量类型能够发挥正确的约束作用,如 type b = 'base' | 'delete' | (string & {}) 所示
类型 b 被定义为 'base' | 'delete' | (string & {}),它与类型 a 的区别在于使用了交叉类型将 string 与空接口类型合并。这样就使得 b 类型拥有了 a 类型的所有取值范围,同时还可以正确地约束变量的取值为 'base' 或 'delete'。因此,当设置变量 d 的值为 'base' 或 'delete' 时,TypeScript 将正确地给出类型提示。