TypeScript - Spridningstyper kan endast skapas från objekttyper


Koden nedan orsakar Spridningstyper kan bara skapas från objekttyper:

const bool = true

console.log({ ...(bool || { foo: 'bar' }) })

Medan följande fungerar bra, vad orsakade felet ovan och hur kan man undertrycka det?

const bool = true

console.log({ ...(bool && { foo: 'bar' }) })

Svar #1

När du gör ||, utvärderar det objektet till vänster och försöker sprida det. Men det kan inte sprida en boolean-variabel, det kan bara sprida ett objekt.

När du gör &&, returnerar uttrycket inom parentes { foo: 'bar' }-objektet, vilket kan spridas.

För att leka med detta, prova:

console.log(true && 'hi') // "hi"
console.log(true || 'hi') // true

Svar #2

Den första översätt så här

Om bool är sann eller objektet... I det fallet försöker det sprida bool men ser att bool är en Boolean, inte ett objekt... Du får felet

Den andra översätt så här

Om bool är true, sprid då detta objekt... Ampersand-tecknet i det fallet gör en kontroll, och säkerställer att bool är true innan objektet sprids... Detta är ekvivalent med att skriva en if-sats...

if (bool) console.log({ ...{ foo: 'bar' } })