typescript中 string & {} 如何理解?

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 & {} 这样的实现效果应该如何理解?

阅读 2.5k
2 个回答

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 将正确地给出类型提示。

新手上路,请多包涵

第一种写法type a = 'base' | 'delete' | stringbasedelete都继承于string类型,所以TS将a认为是string类型,就不会有basedelete的提示。

第二种写法basedelete不继承于string & {}类型,那么TS将b认为是basedeletestring & {}这三个类型的交叉结果,所以就可以给出basedelete的提示。

在TS库有人提过类似的issue,可以看这条评论的解释

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏