TypeScript

結果に対する気づき

Result

export type Success<T> = {
    ok: true,
    result: T,
}

export type Failure<E> = {
    ok: false,
    error: E,
}

export type Result<T, E> =
    | Success<T>
    | Failure<E>

今までこのようなResult型はよく使われてきたと思うが(個人の主観です)

Constructor関数として考えられるのが以下がある

A

export function Success<T, E>(t: T): Result<T, E> {
    return {
        ok: true,
        result: t
    }
}

B

export function Success<T>(t: T): Success<T> {
    return {
        ok: true,
        result: t
    }
}

Aパターンのデメリットとして無駄に型パラメータのEを気にする必要がある
Bパターンは、まぁだいたいBパターンを使うことになるのだが、返り値がSuccess型になっていることぐらい

今回ふと気づいたのが

C

export function Success<T>(t: T): Result<T, never> {
    return {
        ok: true,
        result: t
    }
}

このCパターンで案外うまく動いている気がする