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

阅读 1.7k
1 个回答

一个没在官方用例中出现过的写法小 trick。

https://github.com/microsoft/TypeScript/issues/29729

简而言之,'base''delete' 都是 string 的子类型,所以经过类型合并后,就只剩下 string 了。但 'base''delete' 并不是 string & {} 的子类型,它们无法类型合并,所以它们都会保留。

P.S. 从上面的 Issue 可以看出,社区里大部分人还是希望前者的写法也能支持 Intellisense 的,但应该是某些底层设计的原因导致 TS 对这个特性实现起来很困难,所以是一直搁置的状态的。目前还是需要后者这种 trick 写法,确实不太符合直觉。

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