やあ。TypeScriptの世界へようこそ。
日々コードを書いていると、時々「あれ?これって中身が入っていないのか、それとも『わざと空っぽにしました』という意味なのか、どっちなんだろう?」と迷う瞬間はないかな?
今日は、そんなモヤモヤをスッキリ解決してくれる、ちょっと玄人好みの設定`exactOptionalPropertyTypes`についてお話しするよ。
難しい設定に見えるかもしれないけれど、実は「お部屋の片付け」と同じくらいシンプルな話なんだ。リラックスして聞いていってね。
—
「ない」のにも、種類がある?
TypeScriptには、オプショナルプロパティという便利な機能があるよね。`?` をつけるやつだ。
interface User {
name: string;
age?: number; // 「年齢はあってもなくてもいいよ」という意味
}
ここで、ちょっと意地悪な想像をしてみよう。
「年齢がわからない」状態と、「年齢は空っぽ(undefined)です」とわざわざ宣言する状態。これらをTypeScriptは、デフォルトだと「まあ、どっちも似たようなもんでしょ?」と大目に見てしまうんだ。
でも、大規模なシステムやチーム開発では、この「曖昧さ」がバグの温床になることがある。そこで登場するのが、今回紹介する `exactOptionalPropertyTypes` だ。
—
宅配便で例えてみよう
想像してみて。君がネットショップで注文した商品が届くとするよ。
1. プロパティが存在しない状態(`undefined`を代入すらしていない)
- 「備考欄」がそもそも画面にない状態。配送員さんは「特に何も指示はないんだな」と判断できる。
2. プロパティに `undefined` をわざわざ代入した状態
- 「備考欄」はあるのに、中身を「空(undefined)」で埋めて提出した状態。「わざわざ空であることを伝えたかったのかな?」と、受け取る側は少し警戒するよね。
この設定を `true` にすると、TypeScriptは「『なくてもいい』と言った場所に、わざわざ『空っぽ(undefined)』を突っ込むのは禁止!」と厳しくチェックしてくれるようになるんだ。
—
実際に動かしてみよう
`tsconfig.json` の `compilerOptions` に以下を書き加えるだけで準備は完了。
{
“compilerOptions”: {
“exactOptionalPropertyTypes”: true
}
}
では、コードを見てみよう。
interface User {
name: string;
age?: number;
}
// 普通の使い方(これはもちろんOK)
const user1: User = { name: “タロウ” };
// さあ、問題のケース!
// 「ageには値がない」ことを明示的にundefinedで伝えようとすると……?
const user2: User = {
name: “ハナコ”,
age: undefined, // ← ここでTypeScriptが「おっと!それは許可されてないよ!」と怒ってくれる
};
「えっ、怒られるの? 困る!」と思ったかな?
大丈夫、安心してください。これは「君のコードをより安全にするための愛の鞭」なんだ。
この設定を有効にすることで、「プロパティが存在しないこと」と「プロパティは存在するけど中身が空であること」をコード上で明確に区別しなければならなくなる。 つまり、曖昧な状態が排除されて、プログラムの挙動が予測しやすくなるというわけだね。
—
なぜこの設定が「伝説級」に大事なのか
初心者のうちは、「エラーが出る=面倒くさい」と感じるかもしれない。でも、開発が進めば進むほど、この「曖昧さの排除」が君を助けてくれることになるんだ。
例えば、Reactでコンポーネントに値を渡すときや、データベースにデータを保存するとき。「値が入っていない」ことの意図が明確であればあるほど、バグは減り、後からコードを見た自分やチームメイトが「ああ、ここは意図的に何も入れていないんだな」と瞬時に理解できる。
「なんとなく動く」から「厳密に正しく動く」へ。
この設定は、その第一歩なんだよ。
—
最後に:つまずいても大丈夫
もしこの設定をONにしてエラーがたくさん出てしまったら、焦らずに一つずつ確認していこう。「本当にここは `undefined` を代入する必要があるのか? それとも単にプロパティ自体を削除すればいいのか?」と問いかけるだけで、君のコードの質は格段に上がるはずだ。
TypeScriptは、君がより良い開発者になるための最高のコーチだ。エラーが出たら「教えてくれてありがとう!」とポジティブに受け取ってみてね。
また何か気になったら、いつでも聞いてほしい。君のエンジニアライフが、今日より少しだけ快適になりますように!

コメント