LearnApplyShare

oneOf 유틸

March 04, 2021 - [js]

내가 애정하는 함수 oneOf

type Fn<T> = () => T

export default function oneOf<T>(
  items: Array<[boolean | Fn<boolean>, T | Fn<T>]>,
  defaultValue?: T | Fn<T>,
): T | undefined => {
  const matched = items.find(item =>
    typeof item[0] === 'function' ? item[0]() : item[0],
  )
  const result = matched ? matched[1] : defaultValue
  return typeof result === 'function' ? (result as Fn<T>)() : result
}

여러가지 조건에 따라 선택해야 하는 값이 달라질 경우 유용하게 사용할 수 있다.


아래와 같은 코드를

const value = A ? 1 : B ? 2 : C ? 3 : D ? 4 : 5

이렇게 가독성 높은 코드로 작성할 수 있다.

const value = oneOf(
  [
    [A, 1],
    [B, 2],
    [C, 3],
    [D, 4],
  ],
  5,
)

해당 함수는 @madup-inc/utils 패키지에 포함되어 있어 아래와 같이 사용할 수 있다.

Install

yarn add @madup-inc/utils

Usage

import { oneOf } from '@madup-inc/utils'

oneOf([[true, 2]])  // 2
oneOf([
  [false, 1],
  [false, 2],
  [true, 3],
])  // 3
oneOf([
  [false, 1],
  [true, 2],
])  // 2
oneOf([[false, 1]]) // undefined
oneOf([[false, 1]], 'zzz')  // 'zzz'

// Lazy evaluation
oneOf([() => true, 1])  // 1
oneOf([true, () => 2])  // 2
oneOf([() => true, () => 3])  // 3
oneOf([false, 1], () => 4)  // 4