news 2026/9/26 8:12:13

TypeScript の「マージと拡張」を完全理解する:宣言マージと型拡張の実践ガイド(The Concise TypeScript Book)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TypeScript の「マージと拡張」を完全理解する:宣言マージと型拡張の実践ガイド(The Concise TypeScript Book)
  • 文档
  • 教程

【免费下载链接】typescript-book

The Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source.

项目地址:https://gitcode.com/gh_mirrors/typ/typescript-book
点击查看免费下载

本記事は、オープンソース書籍『The Concise TypeScript Book』の第 53 章「マージと拡張(Merging and Extension)」を深掘りし、TypeScript の型システムを扱う上で欠かせない「マージ(Merging)」と「拡張(Extension)」という 2 つの概念を、実例とともに解説します。本章は同名の宣言を 1 つにまとめる宣言マージと、既存の型やインターフェースを継承・拡張して新たな型を作る仕組みに焦点を当てており、これらを読み解けば、interfaceとtypeの使い分け、ライブラリの型定義を壊さずに拡張する技法まで身につきます。

マージ(Merging):同じ名前の複数の宣言を 1 つの定義に統合する

「マージ」とは、同じ名前を持つ複数の宣言を 1 つの定義にまとめる機能です。最も典型的な例が、同じ名前のインターフェースを複数回定義するケースです。

本章が示す基本例を見てみましょう。

interface X { a: string; } interface X { b: number; } const person: X = { a: 'a', b: 7, };

このコードでは、interface Xが 2 回宣言されています。TypeScript はこれらを単一のインターフェースにマージし、結果としてXはa: stringとb: numberの両方のプロパティを持つものとして扱われます。そのため、personにはaとbの両方を必ず指定する必要があります。

この「宣言マージ」は、TypeScript のinterface固有の強力な機能です。同じ名前のinterfaceを複数宣言してもエラーにはならず、すべての宣言が持つプロパティとメソッドが合体した単一の定義になります。

型エイリアス(type)では宣言マージできない

一方で、typeエイリアスは宣言マージをサポートしません。本書の第 54 章「型とインターフェースの違い(differences-between-type-and-interface.md)」でも指摘されている通り、typeで同名の宣言を複数回行うとコンパイルエラーになります。

// これはエラーになる type A = { x: string; }; type A = { y: string; }; // エラー: 識別子 'A' は重複しています

この違いは、「元の定義を変更せずに追加機能を加えたい」「不足している型や誤った型にパッチを当てたい」といった場面で特に重要になります。ライブラリが公開している型をそのまま書き換えることはできませんが、宣言マージを使えば**外部ライブラリの型を拡張(augmentation)**できます。

宣言マージの実践的な活用:外部型へのパッチ

宣言マージは、例えばサードパーティライブラリが提供するinterfaceに独自のプロパティを追加する場合に威力を発揮します。

// ライブラリ側が定義している型(変更できない) interface Window { title: string; } // 自プロジェクト側でマージして拡張 interface Window { version: string; customProperty?: number; } // これで window.version にアクセスできる

このように、既存の定義を一切変更せずに、型システムのレベルで宣言を追加できます。宣言マージの対象となるのはinterfaceが主ですが、classと同名のinterfaceを宣言してクラスに静的メンバーや追加契約を持たせるといった使い方(クラスとインターフェースのマージ)も可能です。クラス全般の仕組みについては第 55 章「クラス(class.md)」を参照してください。

拡張(Extension):既存の型から新しい型を作る

「拡張」とは、既存の型またはインターフェースを拡張・継承して新しい型を作成する機能です。元の定義を変更せずに、既存の型へ追加のプロパティまたはメソッドを加える仕組みであり、本章ではinterfaceのextendsキーワードによる拡張が例示されています。

interface Animal { name: string; eat(): void; } interface Bird extends Animal { sing(): void; } const dog: Bird = { name: 'Bird 1', eat() { console.log('Eating'); }, sing() { console.log('Singing'); }, };

BirdはAnimalをextendsしており、nameとeat()を継承した上で、独自のsing()を追加しています。その結果、Bird型の値はAnimalのすべてのメンバーを満たしつつ、sing()も実装しなければなりません。

複数の型からの拡張

interfaceは複数の型を一度に拡張することもできます。本書の第 16 章「型の拡張(extending-types.md)」には、次のような例があります。

interface A { a: string; } interface B { b: string; } interface Y extends A, B { y: string; }

この場合Yはa、b、yのすべてのプロパティを持つことになります。複数のinterfaceを組み合わせて契約を合成できるのがポイントです。

extends は interface と class にのみ有効

重要な制約として、extendsキーワードはinterfaceとclassに対してのみ機能します。typeエイリアスを拡張するには、交差型(&演算子)を使う必要があります。

type A = { a: number; }; type B = { b: number; }; type C = A & B;

Cはaとbの両方を持つ交差型(Intersection Type)になります。交差型の詳細は第 33 章「交差型(intersection-types.md)」で解説されています。

片方向の拡張:interface は type を拡張できる

さらに、interfaceでtypeを拡張することはできますが、その逆(typeがinterfaceを&でなく直接拡張すること)はできません。

type A = { a: string; }; interface B extends A { b: string; }

interface Bはtype Aの構造を継承しつつbを追加できるため、既存のtypeをベースに契約を広げたい場合に便利です。

ユニオン型は extends できない

interfaceはユニオン型のような複雑な型をextendsすることはできません(第 54 章より)。ユニオン型を組み合わせたい場合は、typeエイリアスと|演算子を使うのが正攻法です。

type Department = 'dep-x' | 'dep-y'; // ユニオン型

インターフェース同士のユニオンを表現したい場合も、typeを使って間接的に定義します(例:type C = A | B;)。交差型・ユニオン型を自由に組み立てられるのはtypeの大きな柔軟性であり、第 54 章ではこの点が明記されています。

型の拡張におけるもう一つの道具:& 演算子による交差型

拡張の考え方をtypeの世界で実現するのが交差型です。第 54 章では、既存のinterfaceに対してtypeを交差させる例も示されています。

interface A { x: string; y: number; } type B = A & { j: string; }; const c: B = { x: 'x', y: 123, j: 'j', };

interface Aの構造をそのままに、type Bが追加プロパティjを加えた複合型になっています。この書き方は「元の定義を変更せずに型を拡張する」という拡張の目的を、typeの文法で実現する代表的なパターンです。

第 54 章「型とインターフェースの違い」では、interfaceが交差型を組み込みでサポートせず、ユニオン型も間接表現に留まる一方、typeは|と&の両演算子で柔軟に合成できる、という対比が詳述されています。

マージと拡張の違いまとめ

観点マージ(Merging)拡張(Extension)
意味同じ名前の複数の宣言を 1 つの定義に統合既存の型を継承・合成して新しい型を作成
主な対象interface(同名複数宣言)interfaceのextends、typeの&(交差型)
元の定義変更せずに宣言を追加変更せずに新しい型を作る
typeでの実現不可(宣言マージ非対応)交差型&で実現
代表的な用途ライブラリ型へのパッチ、追加機能の付与共通契約の継承、複合型の構築

どちらも「既存の型定義を書き換えずに型の世界を広げる」という点では共通しますが、マージは同名宣言の合体、拡張は新しい型の創出という違いがあります。この 2 つを区別できると、interfaceとtypeの選択基準も明確になります。

まとめ:マージと拡張を使い分ける

『The Concise TypeScript Book』の「マージと拡張」の章が伝える本質は、次の 2 点に要約できます。

  1. マージ:同じ名前のinterfaceを複数回宣言すれば、TypeScript が自動的に 1 つの定義へ統合してくれる。これはtypeにはない能力であり、外部ライブラリの型を拡張する際に強力。
  2. 拡張:interfaceはextendsで既存の型(複数可)を継承し、typeは交差型&で複数の型を合成する。interfaceはtypeを拡張できるが、その逆はできない。

型定義を設計する際は、まず「同じ名前で宣言を追加したいのか(→ マージ)」それとも「既存の型から派生した新しい型が欲しいのか(→ 拡張)」を判断すると、自然と正しい構文を選べるようになります。

本記事の内容は、以下の関連章とあわせて読むことでより深く理解できます。

  • 型とインターフェースの違い:differences-between-type-and-interface.md
  • 型の拡張:extending-types.md
  • 交差型:intersection-types.md
  • インターフェースと型の基本構文:interface-and-type.md
  • クラスと継承:class.md
  • 文档
  • 教程

【免费下载链接】typescript-book

The Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source.

项目地址:https://gitcode.com/gh_mirrors/typ/typescript-book
点击查看免费下载

相关推荐

上一篇:BiliTools终极指南:如何用AI总结功能快速掌握B站视频核心内容
下一篇:如何用Qalculate!彻底简化你的数学计算工作流程 🚀

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/26 8:11:59

AI Agent数据安全实战:从提示注入到合规治理

1. 项目概述:AI Agent 的“安全账本”到底该记什么先说一个我在企业里经常遇到的尴尬场景:业务部门兴致勃勃地推了一个 AI Agent 项目,能自动读取客户邮件、总结需求、起草回复,效率确实肉眼可见地提升了。结果安全团队一进场就傻…

作者头像 李华
网站建设 2026/9/26 8:11:55

嵌入式Linux下MJPG-streamer的搭建原理与实战

这篇聊聊MJPG-streamer。如果你在嵌入式Linux板子上做过USB摄像头采集,或者碰过物联网类的视频监控小项目,大概率听过这个名字。韦东山老师的视频里专门有一节课讲这个方案的实现和原理,我看完之后最大的感受是:它不像FFmpeg那样庞…

作者头像 李华
网站建设 2026/9/26 8:11:51

MiniOB实战指南:C++手写数据库内核的B+树与缓冲池解析

简介:这是一份面向数据库初学者与计算机专业学生的C数据库内核实践资源,聚焦数据库系统原理的动手理解与模块化开发训练。MiniOB由OceanBase与华中科技大学联合打造,通过简化并发等复杂机制,帮助零基础学习者快速掌握SQL执行、事务…

作者头像 李华
网站建设 2026/9/26 8:11:28

AI Agent文档安全实战指南:从权限控制到提示注入拦截

直接进入正题。 AI Agent 能干是真能干,但你有没有想过,它干活的时候把手伸进了哪些文档、又把哪些文档的内容带到了哪里?我最近接了几个企业项目,帮着搭建和复盘 Agent 应用,感触最深的一点是:团队往往把…

作者头像 李华
网站建设 2026/9/26 8:11:07

从黑客松作品拆解交互式人生模拟器的设计与技术实现

知乎黑客松校园新锐季的线上作品展厅里,我第一次看到“假如我们的人生”这个项目时,第一反应是——这名字起得有点讨巧。黑客松(Hackathon)展厅里最常见的作品是AI工具、效率插件、数据可视化面板,名字一个比一个“极客…

作者头像 李华
网站建设 2026/9/26 8:11:07

黑客松项目复盘:互动叙事引擎打造平行人生体验

1. 项目诞生:当“黑客松”遇上“人生选择”这事儿得从一次深夜聊天说起。团队几个人围在一起讨论知乎黑客松校园新锐季的选题,有人抛出一个问题:“如果当初没选这个专业,现在会在哪?”话题瞬间炸了——有人想回到高考填…

作者头像 李华