Next.js と TypeScript で、OR演算子(||)を使う

TwitterFacebookHatena

TL;DR

このページでは、OR 演算子の実装方法について詳しく解説しますね。一言でいうと、OR 演算子とは、複数の条件のうち、一つでも真であれば全体が真となる演算子のことです。これにより、プログラム内で複数の条件を柔軟に扱うことができます。

開発環境 バージョン
Next.js 13.4.4
TypeScript 5.0.4
Emotion 11.11.0
React 18.2.0

OR 演算子とは?

OR 演算子は、論理演算子の一つで、複数の条件式の中から少なくとも一つの条件式が真であれば全体を真と評価する役割があります。JavaScript や TypeScript では、「||」という記号を使って表現します。

以下に、基本的な使用例を示します。

const conditionA = true
const conditionB = false

if (conditionA || conditionB) {
  console.log('少なくとも一つの条件が真です。')
}

上記のコードでは、conditionAは真、conditionBは偽ですが、OR 演算子が使われているため、「少なくとも一つの条件が真です。」というメッセージが出力されます。

短絡評価

JavaScript の OR 演算子(||)は「短絡評価」(short-circuit evaluation)という概念を用いて動作します。これは、OR 演算子の左辺がtrueに評価された場合、その時点で全体の結果がtrueであることが確定するため、右辺の評価をスキップする、という動作のことを指します。

さらに詳しく説明すると、JavaScript の OR 演算子は左から右に評価を進めます。左辺の評価結果がtrue(あるいはtrueに変換される値、たとえば非空の文字列や非ゼロの数値など)であれば、その時点で全体の結果がtrueであることが確定するので、右辺の評価は省略されます。これが「短絡(short-circuit)」の名前の由来です。

また、JavaScript の OR 演算子は、trueまたはfalseというブール値を返すだけでなく、評価された値そのものを返すという特性も持っています。このため、以下のようなコードが可能です。

const value1 = 0 // falsy value
const value2 = 'Hello' // truthy value

const result = value1 || value2
console.log(result) // "Hello"

上記のコードでは、value1falseに変換される値(falsy)であり、value2trueに変換される値(truthy)です。そのため、value1 || value2の結果は、value2の値("Hello")そのものが返されます。

これは、短絡評価という概念と合わせて利用されることで、デフォルト値の指定などによく使われます。例えば、関数の引数が省略された場合のデフォルト値の設定などに活用できます。

function greet(name) {
  name = name || 'Guest'
  console.log('Hello, ' + name + '!')
}

greet('John') // Hello, John!
greet() // Hello, Guest!

上記の例では、greet関数が引数なしで呼び出された場合、nameundefinedとなり、その結果name || "Guest""Guest"を返します。これにより、nameが省略されたときのデフォルト値として"Guest"が設定されるわけです。

OR 演算子(||)も同じように短絡評価が行われます。具体的には、OR 演算子の左辺の評価結果がtrueになる値であれば、その時点で全体の評価を終え、その値を結果として返します。つまり、右辺の評価はスキップされます。

基本的な OR 演算子の短絡評価の例をご紹介しましょう。

console.log(true || false) // true
console.log(false || true) // true
console.log('Hello' || '') // 'Hello'
console.log('' || 'World') // 'World'

ここで、重要なのは JavaScript におけるtrueと評価される値(truthy な値)とfalseと評価される値(falsy な値)を理解することです。例えば、空文字列や数値の0は falsy な値として扱われます。それに対して、空でない文字列や0以外の数値は truthy な値として扱われます。

続いて、OR 演算子の短絡評価を利用したデフォルト値の設定の例を見てみましょう。

type User = {
  name: string
  age: number
  bio?: string
}

const user: User = {
  name: 'Taro',
  age: 30,
}

const bio = user.bio || 'No bio available'
console.log(bio) // 'No bio available'

上記の例では、user.bioundefined(つまり設定されていない)場合には、'No bio available'というデフォルト値を設定しています。

このように、OR 演算子を用いた短絡評価は、デフォルト値の設定など、様々な場面で有用なテクニックとなります。ただし、これも AND 演算子と同様に、使用する際は注意が必要です。特に、期待する値が falsy な値である可能性がある場合(例えば、false0が正当な値である場合など)には、不適切なデフォルト値が設定されてしまう可能性があるため、注意が必要です。

短絡評価は、JavaScript において非常に便利な機能で、様々な場面で用いられます。以下に、その一部をご紹介します。

オブジェクトのプロパティへのアクセス

JavaScript において、存在しないオブジェクトのプロパティにアクセスしようとすると、undefinedが返されます。これをそのまま利用すると問題になる場面があるため、通常は存在チェックを行います。

type User = {
  name: string
  age: number
  profile?: {
    bio: string
    website?: string
  }
}

const user: User = {
  name: 'Taro',
  age: 30,
  profile: {
    bio: 'Hello, world!',
  },
}

const website = user.profile && user.profile.website ? user.profile.website : 'N/A'
console.log(website) // 'N/A'

上記の例では、user.profile.websiteが存在しない場合には、デフォルト値として'N/A'を設定しています。

条件付き関数の実行

特定の条件が真の場合のみ関数を実行したい、という場合もあります。以下の例では、isDebugModetrueの場合のみ、デバッグメッセージをコンソールに出力します。

const isDebugMode = true

isDebugMode && console.log('Debugging...')
// "Debugging..."と出力されます

const isDebugMode = false

isDebugMode && console.log('Debugging...')
// 何も出力されません

これは短絡評価の特性を利用したコードで、isDebugModefalseの場合、console.log('Debugging...')は実行されません。

以上のように、短絡評価はコードを簡潔に記述するための強力なツールとなります。ただし、それが結果的にコードの可読性を下げるような使い方をすることは避けてください。つまり、複雑な条件式を短絡評価で処理するのではなく、適切な制御構文(if 文や switch 文など)を使用する方が良い場合もあります。また、短絡評価の結果を変数に格納する場合、その変数がどのような型の値を持つ可能性があるのかを明確にすることも重要です。

Next.js で、OR 演算子を実装

それでは、Next.js と TypeScript を使って、OR 演算子を使用する状況を具体的に見ていきましょう。ここでは、ユーザーが特定の権限を持っているかどうかを判定するコンポーネントを作成します。

まずは、components/PermissionChecker.tsxというコンポーネントを作ります。

// components/PermissionChecker.tsx

type Props = {
  isAdmin: boolean
  isModerator: boolean
}

const PermissionChecker = ({ isAdmin, isModerator }: Props) => {
  if (isAdmin || isModerator) {
    return <div>管理者権限を持っています。</div>
  } else {
    return <div>管理者権限を持っていません 。</div>
  }
}

export default PermissionChecker

上記のコンポーネントでは、props としてisAdminisModeratorを受け取り、ユーザーが管理者(isAdmin)かモデレーター(isModerator)のいずれかであれば「管理者権限を持っています。」というメッセージを表示します。OR 演算子が使われているため、いずれか一つでも真であれば「管理者権限を持っています。」と表示されます。

OR 演算子を実装

さらにテクニカルな例として、Next.js でのページ遷移を制御するためのコードを考えてみましょう。例えば、ユーザーがログインしているか、または特定の条件を満たしている場合にのみページ遷移を許可するようなケースです。

// pages/Dashboard.tsx

import { useRouter } from 'next/router'
import { useEffect } from 'react'

type Props = {
  isLoggedIn: boolean
  isSpecialCondition: boolean
}

const Dashboard = ({ isLoggedIn, isSpecialCondition }: Props) => {
  const router = useRouter()

  useEffect(() => {
    if (!(isLoggedIn || isSpecialCondition)) {
      router.push('/login')
    }
  }, [isLoggedIn, isSpecialCondition, router])

  return <div>ダッシュボード</div>
}

export default Dashboard

上記のコードでは、isLoggedIn(ログイン状態)かisSpecialCondition(特定の条件)のいずれかが真でなければ、/loginページへリダイレクトします。これは、!(isLoggedIn || isSpecialCondition)という式により、どちらも偽である場合に限り真となるように実装されています。

以上、OR 演算子の使い方とその活用例を Next.js と TypeScript の視点から解説しました。これらを理解し活用することで、より柔軟な条件分岐を実装できるようになるでしょう。

Next.js と TypeScript で、OR演算子(||)を使う