Hva er forskjellen mellom string og string som er krysset med det tomme objektet i TypeScript


Bakgrunn

Jeg la merke til at Chakra UI bruker denne typen:

type ColorScheme = (string & {}) | "whiteAlpha" | "blackAlpha" | "gray" | "red" | "orange" | "yellow" | "green" | "teal" | "blue" | "cyan" | "purple" | "pink" | "linkedin" | "facebook" | "messenger" | "whatsapp" | "twitter" | "telegram" | undefined

Min første tanke var at kanskje (string & {}) lurte autokomplettering til å fungere, noe som ser ut til å være korrekt basert på mine observasjoner:

// Has autocompletion
type Test = (string & {}) | "blue";
let x: Test = "blue"

// Doesn't have autocompletion
type Test2 = string | "blue";
let y: Test2 = "blue"

Lekeromlenke

Spørsmålet

Hvorfor i all verden er det en forskjell mellom string og (string & {})? Så vidt jeg forstår, representerer {}-typen hvilken som helst verdi unntatt null | undefined, så en streng er et delsett av det, og per definisjon, hvis A ⊂ B, så er A ∪ B=A, ikke sant? Kanskje jeg er gal, men denne oppførselen virker virkelig merkelig. Takk!

Relaterte artikler