NITS TIPS

~微塵集合知巧~

TypeScriptにおける「hoge?: string」と「hoge: string | undefined」 の違い

最終更新日: 2025-01-11記事投稿日: 2025-01-11

nobumitsu-1995のgithubトップ

Frontend developer

nobumitsu-1995


概要

TypeScriptの型システムで紛らわしい概念の1つとして、「オプショナルプロパティ」とundefinedの扱いがあります。本記事では、これらの違いをまとめてみます。

オプショナルプロパティとは

 以下のようにプロパティ名の後に「?」がついてるのがオプショナルプロパティ。

type OptionalType = { name?: string }

 オプショナルプロパティには以下のような特徴があります。

  • プロパティ自体が存在しなくてもOK
  • この場合namestring またはundefinedになる

この特徴は一見、ユニオン型を使用した以下のような記述と同じに感じられますが、明確な違いがあります。

type UnionType = { name: string | undefined }

オプショナルプロパティとユニオン型を使用した書き方の違い

 オプショナルプロパティとユニオン型を使用した書き方の違いをまとめると以下の表のようになります。

オプショナルプロパティ

ユニオン型を使用した書き方

プロパティが取りうる値

string | undefined

string | undefined

プロパティの存在の可否

存在しなくてもOK

必ず存在しなければならない

プロパティを省略した場合の挙動

nameはundefinedと解釈される

コンパイルエラー

文章だと分かりづらいのですが... お手元のコードエディターに以下コードを貼り付けると違いが一目瞭然です👀

type OptionalType = {
  name?: string
}
type UnionType = {
  name: string | undefined
}

const obj1: OptionalType = {}
const obj2: UnionType = {}

console.log(obj1)
console.log(obj2)

obj2には存在しなければいけないnameプロパティが定義されていないのでエラーになります!(obj2name: undefinedを追加するとエラーは解消されるので気になる方は試してみてください👀)

まとめ

 オプショナルプロパティとユニオン型を使用した書き方の使い分け方は以下のように考えれば良さそうです👀

  • ?: プロパティの存在自体が任意の値の場合
  • | undefined: プロパティは必ず存在していて欲しいが、値が未定義にもなりうる場合

 TypeScriptのhoge?: stringhoge: string | undefined は似ているようで異なる概念です。使用箇所の要件や型の安全性を考慮し、適切に使い分けることが重要になります。

参考文献


関連記事

  • 最終更新日: 2024-07-09記事投稿日: 2024-07-09

    PayloadとArgumentの使い分け方

    typescriptで型を宣言するとき〇〇Payloadとか××Argumentとか名付けることが多いがその違いについて真面目に考えたことがなかったので調べてみた。

  • 最終更新日: 2024-04-07記事投稿日: 2024-04-07

    テンプレートリテラル型で引数が「/」で始まっているかチェックする

    テンプレートリテラル型を使用することで引数が「/」で始まっているかをチェックすることができます。これによって引数にURLを受け取る関数などで、起こるエラーを回避することができます。

  • 最終更新日: 2024-04-08記事投稿日: 2024-03-31

    丸め誤差に対応した計算方法

    コンピュータによる浮動小数点型の数値計算などで現れる丸め誤差。そんな丸め誤差に対応した数値計算のコードをjavascriptで書く方法を紹介します。

  • 最終更新日: 2024-08-06記事投稿日: 2024-08-06

    ARIA属性を活用したアクセシブルなモーダル実装

    アクセシブルなmodalを実装するために必要なaria属性が意外と多い。参考となるコードをメモとして残しておきたい。