Search

Option

fp-ts Option 사용법

fp-ts 라이브러리는 함수형 프로그래밍을 지원하는 TypeScript 라이브러리입니다. fp-ts 라이브러리에서 가장 많이 사용되는 데이터 타입 중 하나가 Option입니다. 이 문서에서는 Option의 사용법을 자세히 다루도록 하겠습니다.

Option이란?

Option은 값이 있을 수도 있고 없을 수도 있는 타입을 나타냅니다. null 또는 undefined와 같은 값이 있을 수도 있고 없을 수도 있는 타입을 대체하며, 일반적으로 함수의 반환값으로 사용됩니다.
예를 들어, 다음과 같은 함수가 있다고 가정해봅시다.
function findUserById(id: number): Option<User> { const user = users.find(user => user.id === id) return user ? some(user) : none }
Plain Text
복사
위 함수는 id에 해당하는 유저 객체를 찾아 Option으로 반환합니다. 만약 해당하는 유저가 없다면 none을 반환합니다. 이러한 방식으로 Option은 값이 있을 수도 있고 없을 수도 있는 함수의 반환값으로 사용됩니다.

Option의 생성

Optionnonesome 두 가지 값을 가집니다. none은 값이 없음을 나타내며, some은 값이 있음을 나타냅니다. Option을 생성하는 방법은 다음과 같습니다.

none

import { Option, none } from 'fp-ts/lib/Option' const value: Option<number> = none
Plain Text
복사

some

import { Option, some } from 'fp-ts/lib/Option' const value: Option<number> = some(1)
Plain Text
복사

Option의 사용

Option은 값이 있을 수도 있고 없을 수도 있기 때문에, 값이 있는지 확인 후 해당 값을 사용해야 합니다. 이를 위해 Option은 다음과 같은 메소드를 제공합니다.

map

mapOption에 들어있는 값에 함수를 적용하는 역할을 합니다. 값이 있을 경우 함수를 적용하고, 값이 없으면 none을 반환합니다.
import { Option, some } from 'fp-ts/lib/Option' const increment = (x: number): number => x + 1 const value: Option<number> = some(1) const result: Option<number> = value.map(increment) // some(2)
Plain Text
복사

getOrElse

getOrElseOption에 값이 없을 경우 기본값을 반환합니다.
import { Option, none } from 'fp-ts/lib/Option' const defaultValue = 1 const value: Option<number> = none const result: number = value.getOrElse(defaultValue) // 1
Plain Text
복사

fold

foldOption에 값이 있을 경우 첫 번째 함수를, 값이 없을 경우 두 번째 함수를 실행합니다.
import { Option, some, none } from 'fp-ts/lib/Option' const increment = (x: number): number => x + 1 const defaultValue = 1 const value1: Option<number> = some(1) const result1: number = value1.fold(() => defaultValue, increment) // 2 const value2: Option<number> = none const result2: number = value2.fold(() => defaultValue, increment) // 1
Plain Text
복사

Option을 활용한 코드 예시

Option은 값이 있을 수도 있고 없을 수도 있는 타입을 대체하는 것이기 때문에, if문이나 null 체크를 대체하는 역할을 할 수 있습니다. 다음은 Option을 활용한 예시 코드입니다.
import { some, none, Option } from 'fp-ts/lib/Option' import { pipe } from 'fp-ts/lib/pipeable' type User = { id: number name: string } const users: User[] = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, { id: 3, name: 'Charlie' }, ] function findUserById(id: number): Option<User> { const user = users.find(user => user.id === id) return user ? some(user) : none } function greetUser(id: number): string { return pipe( findUserById(id), fold( () => 'User not found', user => `Hello, ${user.name}!` ) ) } console.log(greetUser(1)) // "Hello, Alice!" console.log(greetUser(4)) // "User not found"
Plain Text
복사
위 예시 코드에서는 Option을 활용하여, 유저를 찾을 수 없을 때 if문이나 null 체크를 대체하고 있습니다. pipefold 함수를 사용하여, Option을 체이닝하고, 값이 없을 경우 디폴트 값을 반환하도록 구현하였습니다.

참고 링크