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