Conditional Destructuring Assignment

About

μ •ν™•ν•œ λͺ…칭을 λͺ°λΌμ„œ Conditional Destructuring Assignment라고 이름 뢙이도둝 ν•˜κ² λ‹€.

JavaScript와 MongoDB Official Driverλ₯Ό μ“Έ λ•Œ, optionalν•œ 값을 λ„˜κΈΈ λ•Œ μ‚¬μš©ν•˜κ²Œ λœλ‹€.

κ·ΈλŸ¬λ‹ˆκΉŒ, 값이 μ „λ‹¬λ˜λ©΄(λ˜λŠ” truthyν•˜λ©΄) μ‚¬μš©ν•˜κ³ , 값이 μ „λ‹¬λ˜μ§€ μ•ŠμœΌλ©΄(λ˜λŠ” falsyν•˜λ©΄) μ‚¬μš©ν•˜μ§€ μ•Šμ„ λ•Œ μ“Έ 수 μžˆλ‹€.

Code

post.repository.ts
async function findPosts(
{
  user,
  postType,
  deleted,
}: {
  user?: User,
  postType?: PostType,
  deleted: boolean = false,
}): Promise<Post[]> {
  return postRepository.find({
    ...(user && { user }),
    ...(postType && { type: postType }),
    ...(deleted && { deletedAt: { $exists: true, $ne: null } } )
  })
}

Post λΌλŠ” κ²Œμ‹œκΈ€μ„ μœ„ν•œ Mongo μ»¬λ ‰μ…˜(collection)이 있고, ν•΄λ‹Ή μ»¬λ ‰μ…˜μ—λŠ” 아이디 _id, μž‘μ„±μž user, κ²Œμ‹œκΈ€ νƒ€μž… type, μ‚­μ œ μ‹œκ° deletedAt λ“±μ˜ ν•„λ“œ(fields)듀이 μžˆλ‹€κ³  κ°€μ •ν•˜μž. Post μ»¬λ ‰μ…˜μ—μ„œ λ„νλ¨ΌνŠΈ(document)λ₯Ό 필터링해 λ°°μ—΄(Post[])둜 λ°›μ•„μ˜€λŠ” repository ν•¨μˆ˜μ΄λ‹€.

각 λ§€κ°œλ³€μˆ˜λŠ” ?λ₯Ό λΆ™μ—¬ optionalν•˜κ²Œ ν•˜μ˜€λ‹€. 값이 μ „λ‹¬λ˜λ©΄ 값이 λ“€μ–΄κ°ˆ 것이고, μ „λ‹¬λ˜μ§€ μ•ŠμœΌλ©΄ undefinedκ°€ 될 것이닀.

이 문법을 μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œλŠ” ꡬ쑰 λΆ„ν•΄ (Destructuring Assignment)에 λŒ€ν•œ 이해가 μ„ ν–‰λ˜μ–΄μ•Ό ν•œλ‹€. Destructuing Assignment μ°Έκ³ .

  • user에 값이 μ „λ‹¬λ˜λ©΄ user && { user } μ—μ„œ userκ°€ truthyν•˜κ²Œ 되고, { user } κ°€ λ°˜ν™˜λœλ‹€. 그러면 ꡬ쑰 뢄해에 μ˜ν•΄ ...{ user }κ°€ 되고, κ²°κ΅­ userκ°€ λœλ‹€. μ „λ‹¬λ˜μ§€ μ•ŠμœΌλ©΄ falsyν•˜κ²Œ λ˜μ–΄μ„œ undefinedκ°€ 되고, μ•„λ¬΄λŸ° 값도 μ•ˆλ“€μ–΄κ°€μ„œ μ• μ΄ˆμ— user을 μ•ˆ 넣은 것과 κ°™κ²Œ λœλ‹€.

  • postTypeλŠ” λΉ„μŠ·ν•œλ° 쑰금 λ‹€λ₯΄λ‹€. ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜ 이름은 postType인데 μ‹€μ œ DB ν•„λ“œλͺ…은 type이닀. 그러면 κ·Έλƒ₯ μ˜ˆμ‹œμ²˜λŸΌ keyλ₯Ό type으둜 λ°”κΏ”μ£Όλ©΄ λœλ‹€.

  • deleted도 postTypeκ³Ό λΉ„μŠ·ν•˜λ‹€. $exists, $ne 필터링을 μ‚¬μš©ν•œ μ‘μš© 버전이라고 보면 λœλ‹€.

Conclusion

κ°œμΈμ μœΌλ‘œλŠ” 맀우 μœ μš©ν•œλ° 레퍼런슀λ₯Ό μ°ΎκΈ° μ–΄λ ΅λ‹€κ³  λŠλ‚€λ‹€. μƒκΉ€μƒˆκ°€ 쑰금 νŠΉμ΄ν•΄μ„œ κΈ°μ–΅ν•˜κΈ° μ–΄λ €μšΈ 수 μžˆλŠ”λ°, λͺ‡ 번 보고 λ‚˜λ©΄ 원리λ₯Ό μ΄ν•΄ν•˜κ²Œ λ˜μ–΄μ„œ 자유둭게 μ“Έ 수 있게 λœλ‹€.

Last updated