TypeScriptの基本:JavaScript開発をレベルアップさせるために
はじめに
JavaScriptは、Web開発の世界で最も普及している言語の一つです。しかし、その柔軟性と動的型付けという特徴は、大規模なプロジェクトや複雑なアプリケーションを開発する際に、予期せぬバグやメンテナンスの困難さを招くことがあります。そこで登場するのが TypeScript です。
TypeScriptは、JavaScriptに静的型付けを追加したスーパーセットであり、開発者がより安全で保守性の高いコードを書くことを支援します。この記事では、TypeScriptの基本から応用までを網羅的に解説し、JavaScript開発をどのようにレベルアップさせることができるのかを具体的に説明します。
1. TypeScriptとは何か?
TypeScriptは、Microsoftによって開発されたオープンソースのプログラミング言語です。JavaScriptのスーパーセットとして設計されており、JavaScriptのコードに型情報を付加することで、より堅牢で保守性の高いコードを作成できます。
1.1 TypeScriptの主な特徴
- 静的型付け: 変数、関数、オブジェクトなどの型を明示的に指定することで、コンパイル時に型エラーを検出できます。
- JavaScriptのスーパーセット: 既存のJavaScriptコードをTypeScriptで利用でき、TypeScriptコンパイラはTypeScriptコードをJavaScriptコードに変換します。
- クラスベースのオブジェクト指向プログラミング: クラス、インターフェース、継承などのオブジェクト指向プログラミングの概念をサポートしています。
- 優れたIDEサポート: Visual Studio CodeなどのIDEで、コード補完、エラーチェック、リファクタリングなどの豊富な機能を利用できます。
- 大規模開発の容易化: 型情報やモジュールシステムにより、大規模なプロジェクトでもコードの可読性、保守性、再利用性を向上させることができます。
1.2 TypeScriptのメリット
- 早期エラー検出: コンパイル時に型エラーを発見できるため、実行時のエラーを減らすことができます。
- コードの可読性向上: 型情報がコードに明示されることで、コードの意図が明確になり、可読性が向上します。
- 保守性の向上: コードの変更やリファクタリングが容易になり、長期的な保守性が向上します。
- チーム開発の効率化: 型情報により、チームメンバー間でのコードの共有や理解が容易になり、開発効率が向上します。
- オブジェクト指向プログラミングのサポート: クラスやインターフェースなどのオブジェクト指向プログラミングの概念を利用できるため、より構造化されたコードを書くことができます。
1.3 TypeScriptのデメリット
- 学習コスト: TypeScriptの型システムやオブジェクト指向プログラミングの概念を習得する必要があります。
- コンパイル時間の増加: TypeScriptコードをJavaScriptコードに変換する際に、コンパイル時間が発生します。
- コード量の増加: 型情報を記述する必要があるため、JavaScriptに比べてコード量が増加する場合があります。
2. TypeScriptの環境構築
TypeScriptを使用するためには、開発環境を構築する必要があります。ここでは、Node.jsとnpm(Node Package Manager)を使用した環境構築の手順を説明します。
2.1 Node.jsとnpmのインストール
TypeScriptを使用するためには、まずNode.jsとnpmをインストールする必要があります。Node.jsは、JavaScriptをサーバーサイドで実行するためのプラットフォームであり、npmはNode.jsのパッケージ管理ツールです。
- Node.jsの公式サイト (https://nodejs.org/) から、お使いのOSに合ったインストーラをダウンロードします。
- インストーラを実行し、指示に従ってNode.jsとnpmをインストールします。
- インストールが完了したら、ターミナルまたはコマンドプロンプトを開き、以下のコマンドを実行して、Node.jsとnpmのバージョンを確認します。
bash
node -v
npm -v
バージョンが表示されれば、インストールは成功です。
2.2 TypeScriptのインストール
Node.jsとnpmがインストールされたら、npmを使用してTypeScriptをインストールします。ターミナルまたはコマンドプロンプトを開き、以下のコマンドを実行します。
bash
npm install -g typescript
このコマンドは、TypeScriptをグローバルにインストールします。グローバルにインストールすることで、どのプロジェクトからでもTypeScriptコンパイラを使用できます。
インストールが完了したら、以下のコマンドを実行して、TypeScriptのバージョンを確認します。
bash
tsc -v
バージョンが表示されれば、TypeScriptのインストールは成功です。
2.3 TypeScriptコンパイラの設定
TypeScriptコードをJavaScriptコードに変換するためには、TypeScriptコンパイラ(tsc
)を使用します。コンパイラの設定は、tsconfig.json
ファイルで行います。
- プロジェクトのルートディレクトリに、
tsconfig.json
ファイルを作成します。 tsconfig.json
ファイルに、以下の内容を記述します。
json
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"outDir": "./dist",
"rootDir": "./src",
"sourceMap": true,
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
},
"include": [
"src/**/*"
],
"exclude": [
"node_modules"
]
}
compilerOptions
: コンパイラのオプションを指定します。target
: コンパイル後のJavaScriptのバージョンを指定します(例:es5
,es6
,esnext
)。module
: モジュールの形式を指定します(例:commonjs
,amd
,esnext
)。outDir
: コンパイル後のJavaScriptコードの出力先ディレクトリを指定します。rootDir
: TypeScriptコードのルートディレクトリを指定します。sourceMap
: ソースマップを生成するかどうかを指定します。strict
: 厳格な型チェックを行うかどうかを指定します。esModuleInterop
: ESモジュールとCommonJSモジュール間の相互運用を有効にするかどうかを指定します。skipLibCheck
: 型定義ファイルのチェックをスキップするかどうかを指定します。forceConsistentCasingInFileNames
: ファイル名の大文字小文字を区別するかどうかを指定します。
include
: コンパイル対象のファイルを指定します。exclude
: コンパイル対象から除外するファイルを指定します。
2.4 開発環境のセットアップ
TypeScriptの開発を効率的に行うためには、適切な開発環境をセットアップすることが重要です。
- エディタ: Visual Studio Code (VSCode) は、TypeScriptの開発に最適なエディタの一つです。TypeScriptのサポートが充実しており、コード補完、エラーチェック、デバッグなどの機能を利用できます。
- 拡張機能: VSCodeには、TypeScriptの開発を支援する多くの拡張機能があります。例えば、ESLintやPrettierなどの拡張機能を使用することで、コードの品質を向上させることができます。
- デバッガ: VSCodeには、TypeScriptコードをデバッグするためのデバッガが組み込まれています。ブレークポイントを設定したり、変数の値を調べたりしながら、コードの実行をステップごとに確認できます。
3. TypeScriptの基本的な型
TypeScriptの最も重要な機能の一つは、静的型付けです。TypeScriptでは、変数、関数、オブジェクトなどの型を明示的に指定することで、コンパイル時に型エラーを検出できます。ここでは、TypeScriptの基本的な型について説明します。
3.1 基本型
boolean
: 真偽値(true
またはfalse
)を表します。
typescript
let isDone: boolean = false;
number
: 数値を表します。整数、浮動小数点数など、すべての数値が含まれます。
typescript
let decimal: number = 6;
let hex: number = 0xf00d;
let binary: number = 0b1010;
let octal: number = 0o744;
string
: 文字列を表します。
``typescript
Bob Bobbington
let color: string = "blue";
color = 'red';
let fullName: string =;
Hello, my name is ${ fullName }.
let age: number = 37;
let sentence: string =
I’ll be ${ age + 1 } years old next month.`;
“`
array
: 配列を表します。配列の要素の型を指定できます。
typescript
let list: number[] = [1, 2, 3];
let list: Array<number> = [1, 2, 3]; // ジェネリック型を使用した配列
tuple
: タプルを表します。タプルは、要素の型と数が固定された配列です。
typescript
let x: [string, number];
x = ["hello", 10]; // OK
// x = [10, "hello"]; // エラー
console.log(x[0].substring(1)); // OK
// console.log(x[1].substring(1)); // エラー: numberにはsubstringは存在しない
// x[3] = "world"; // エラー: インデックス3には要素が存在しない
// console.log(x[5].toString()); // エラー: インデックス5には要素が存在しない
enum
: 列挙型を表します。列挙型は、名前付き定数の集合です。
typescript
enum Color {Red, Green, Blue}
let c: Color = Color.Green;
enum Color {Red = 1, Green, Blue}
let c: Color = Color.Green; // 2
enum Color {Red = 1, Green = 2, Blue = 4}
let c: Color = Color.Blue; // 4
enum Color {Red = 1, Green, Blue}
let colorName: string = Color[2];
console.log(colorName); // 'Green'
any
: 任意の型を表します。any
型は、TypeScriptの型チェックを無効にします。
typescript
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // OK, definitely a boolean
let notSure: any = 4;
notSure.ifItExists(); // OK, ifItExistsは実行時に存在するかもしれない
notSure.toFixed(); // OK, toFixedは存在する (ただしコンパイラはチェックしない)
let prettySure: Object = 4;
// prettySure.toFixed(); // エラー: Property 'toFixed' does not exist on type 'Object'.
void
: 値を返さない関数の戻り値の型として使用されます。
typescript
function warnUser(): void {
console.log("This is my warning message");
}
let unusable: void = undefined;
// Strictモードでは、nullをvoid型の変数に代入することはできません。
null
とundefined
: それぞれnull
とundefined
を表します。
typescript
let u: undefined = undefined;
let n: null = null;
never
: 決して発生しない値の型として使用されます。
“`typescript
// neverを返す関数は、関数の到達可能な終端を持ちません。
function error(message: string): never {
throw new Error(message);
}
// 推論された戻り値の型はnever
function fail() {
return error(“Something failed”);
}
// neverを返す関数は、到達可能な終端を持ちません。
function infiniteLoop(): never {
while (true) {
}
}
“`
object
: プリミティブ型ではないものを表します(number
、string
、boolean
、symbol
、null
、undefined
)。
“`typescript
declare function create(o: object | null): void;
create({ prop: 0 }); // OK
create(null); // OK
// create(42); // エラー: Argument of type ’42’ is not assignable to parameter of type ‘object’.
// create(“string”); // エラー: Argument of type ‘”string”‘ is not assignable to parameter of type ‘object’.
// create(false); // エラー: Argument of type ‘false’ is not assignable to parameter of type ‘object’.
// create(undefined); // エラー: Argument of type ‘undefined’ is not assignable to parameter of type ‘object | null’.
“`
3.2 型推論
TypeScriptは、変数の型を明示的に指定しなくても、初期値や文脈から型を推論することができます。
typescript
let x = 3; // xはnumber型として推論される
let y = "hello"; // yはstring型として推論される
3.3 型アノテーション
変数の型を明示的に指定することを型アノテーションと呼びます。型アノテーションを使用することで、コードの可読性を向上させ、型エラーを早期に検出することができます。
typescript
let x: number = 3; // xはnumber型として明示的に指定される
let y: string = "hello"; // yはstring型として明示的に指定される
4. 関数
TypeScriptでは、関数の引数と戻り値の型を指定することができます。これにより、関数の利用時に型エラーを検出でき、より安全なコードを作成できます。
4.1 関数の型
関数の型は、引数の型と戻り値の型で構成されます。
“`typescript
function add(x: number, y: number): number {
return x + y;
}
let myAdd: (x: number, y: number) => number =
function(x: number, y: number): number { return x + y; };
“`
4.2 オプション引数とデフォルト引数
TypeScriptでは、関数の引数をオプションにしたり、デフォルト値を設定したりすることができます。
“`typescript
function buildName(firstName: string, lastName?: string) {
if (lastName)
return firstName + ” ” + lastName;
else
return firstName;
}
let result1 = buildName(“Bob”); // “Bob”
let result2 = buildName(“Bob”, “Adams”); // “Bob Adams”
// let result3 = buildName(“Bob”, “Adams”, “Sr.”); // エラー: 引数が多すぎる
let result4 = buildName(“Bob”, undefined); // “Bob”
function buildName(firstName: string, lastName = “Smith”) {
return firstName + ” ” + lastName;
}
let result1 = buildName(“Bob”); // “Bob Smith”
let result2 = buildName(“Bob”, undefined); // “Bob Smith”
let result3 = buildName(“Bob”, “Adams”); // “Bob Adams”
// let result4 = buildName(“Bob”, “Adams”, “Sr.”); // エラー: 引数が多すぎる
“`
4.3 可変長引数
TypeScriptでは、可変長引数を使用することができます。可変長引数は、関数に任意の数の引数を渡すことができる機能です。
“`typescript
function buildName(firstName: string, …restOfName: string[]) {
return firstName + ” ” + restOfName.join(” “);
}
let employeeName = buildName(“Joseph”, “Samuel”, “Lucas”, “MacKinzie”);
“`
4.4 アロー関数
TypeScriptでは、アロー関数を使用することができます。アロー関数は、従来の関数よりも簡潔な構文で関数を定義できる機能です。
typescript
let myAdd: (x: number, y: number) => number =
(x: number, y: number): number => { return x + y; };
5. オブジェクト指向プログラミング
TypeScriptは、クラス、インターフェース、継承などのオブジェクト指向プログラミングの概念をサポートしています。これにより、より構造化されたコードを書くことができます。
5.1 クラス
TypeScriptでは、クラスを使用してオブジェクトの設計図を定義することができます。クラスは、プロパティ(データ)とメソッド(関数)をまとめたものです。
“`typescript
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return “Hello, ” + this.greeting;
}
}
let greeter = new Greeter(“world”);
“`
5.2 インターフェース
TypeScriptでは、インターフェースを使用してオブジェクトの形状を定義することができます。インターフェースは、オブジェクトが持つべきプロパティの名前と型を記述したものです。
“`typescript
interface Person {
firstName: string;
lastName: string;
}
function greeter(person: Person) {
return “Hello, ” + person.firstName + ” ” + person.lastName;
}
let user = { firstName: “Jane”, lastName: “User” };
console.log(greeter(user));
“`
5.3 継承
TypeScriptでは、クラスを継承して、既存のクラスのプロパティとメソッドを再利用することができます。継承は、コードの再利用性を高めるための重要な機能です。
``typescript
${this.name} moved ${distanceInMeters}m.`);
class Animal {
name: string;
constructor(theName: string) { this.name = theName; }
move(distanceInMeters: number = 0) {
console.log(
}
}
class Snake extends Animal {
constructor(name: string) { super(name); }
move(
記事の続きです。
distanceInMeters = 5) {
console.log("Slithering...");
super.move(distanceInMeters);
}
}
class Horse extends Animal {
constructor(name: string) { super(name); }
move(distanceInMeters = 45) {
console.log(“Galloping…”);
super.move(distanceInMeters);
}
}
let sam = new Snake(“Sammy the Python”);
let tom: Animal = new Horse(“Tommy the Palomino”);
sam.move();
tom.move(34);
“`
5.4 アクセス修飾子
TypeScriptでは、クラスのプロパティやメソッドにアクセス修飾子を設定することができます。アクセス修飾子は、プロパティやメソッドの可視性を制御するための機能です。
public
: どこからでもアクセス可能です(デフォルト)。private
: クラスの内部からのみアクセス可能です。protected
: クラスの内部、およびサブクラスからアクセス可能です。
“`typescript
class Animal {
private name: string;
constructor(theName: string) { this.name = theName; }
}
// new Animal(“Cat”).name; // エラー: Property ‘name’ is private and only accessible within class ‘Animal’.
“`
5.5 抽象クラス
TypeScriptでは、抽象クラスを定義することができます。抽象クラスは、インスタンスを作成することができないクラスであり、サブクラスで実装されるべき抽象メソッドを持つことができます。
typescript
abstract class Animal {
abstract makeSound(): void;
move(): void {
console.log("roaming the earth...");
}
}
6. ジェネリクス
TypeScriptのジェネリクスは、型をパラメータ化する機能です。ジェネリクスを使用することで、複数の型に対して同じ処理を行う関数やクラスを定義することができます。
6.1 ジェネリック関数
ジェネリック関数は、型パラメータを持つ関数です。型パラメータは、関数の呼び出し時に具体的な型で置き換えられます。
“`typescript
function identity
return arg;
}
let myString: string = identity
let myNumber: number = identity
let myBoolean: boolean = identity
“`
6.2 ジェネリックインターフェース
ジェネリックインターフェースは、型パラメータを持つインターフェースです。
“`typescript
interface GenericIdentityFn
(arg: T): T;
}
function identity
return arg;
}
let myIdentity: GenericIdentityFn
“`
6.3 ジェネリッククラス
ジェネリッククラスは、型パラメータを持つクラスです。
“`typescript
class GenericNumber
zeroValue: T;
add: (x: T, y: T) => T;
}
let myGenericNumber = new GenericNumber
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x: number, y: number): number {
return x + y;
};
“`
6.4 型制約
ジェネリクスには、型制約を設定することができます。型制約は、型パラメータが満たすべき条件を指定するものです。
“`typescript
interface Lengthwise {
length: number;
}
function loggingIdentity
console.log(arg.length); // Now we know it has a .length property, so no more error
return arg;
}
“`
7. モジュール
TypeScriptでは、モジュールを使用してコードを分割し、整理することができます。モジュールは、関連するコードをまとめて管理するための機能です。
7.1 モジュールの定義
TypeScriptでは、export
キーワードを使用して、モジュールから公開する変数、関数、クラスなどを指定します。
“`typescript
// myModule.ts
export interface StringValidator {
isAcceptable(s: string): boolean;
}
export const numberRegexp = /^[0-9]+$/;
export class ZipCodeValidator implements StringValidator {
isAcceptable(s: string) {
return s.length === 5 && numberRegexp.test(s);
}
}
“`
7.2 モジュールのインポート
TypeScriptでは、import
キーワードを使用して、他のモジュールから公開された変数、関数、クラスなどをインポートします。
“`typescript
// app.ts
import { StringValidator, ZipCodeValidator } from “./myModule”;
let myValidator = new ZipCodeValidator();
console.log(myValidator.isAcceptable(“12345”)); // true
“`
7.3 モジュールの種類
TypeScriptでは、ESモジュールとCommonJSモジュールの2種類のモジュールを使用できます。ESモジュールは、ES2015で導入された標準的なモジュール形式であり、CommonJSモジュールは、Node.jsで使用されるモジュール形式です。
8. 名前空間(Namespace)
名前空間は、グローバルスコープの汚染を避けるために、コードを論理的にグループ化する方法です。モジュールに似ていますが、モジュールの方がより推奨される方法です。
“`typescript
namespace Validation {
export interface StringValidator {
isAcceptable(s: string): boolean;
}
const lettersRegexp = /^[A-Za-z]+$/;
const numberRegexp = /^[0-9]+$/;
export class LettersOnlyValidator implements StringValidator {
isAcceptable(s: string) {
return lettersRegexp.test(s);
}
}
export class ZipCodeValidator implements StringValidator {
isAcceptable(s: string) {
return s.length === 5 && numberRegexp.test(s);
}
}
}
// 使用例
let strings = [“Hello”, “98052”, “101”];
let validators: { [s: string]: Validation.StringValidator; } = {};
validators[“ZIP code”] = new Validation.ZipCodeValidator();
validators[“Letters only”] = new Validation.LettersOnlyValidator();
for (let s of strings) {
for (let name in validators) {
let isMatch = validators[name].isAcceptable(s);
console.log("${s}" - ${name}: ${isMatch ? "matches" : "does not match"}
);
}
}
“`
9. 型定義ファイル(.d.ts)
TypeScriptでは、JavaScriptライブラリの型情報を記述した型定義ファイル(.d.ts
)を使用することができます。型定義ファイルを使用することで、JavaScriptライブラリをTypeScriptで使用する際に、型チェックやコード補完などの機能を利用できます。
9.1 型定義ファイルの作成
型定義ファイルは、.d.ts
という拡張子を持つファイルであり、JavaScriptライブラリのAPIの型情報を記述します。型定義ファイルは、手動で作成することも、DefinitelyTypedなどのリポジトリからダウンロードすることもできます。
9.2 型定義ファイルの利用
型定義ファイルを利用するには、TypeScriptコンパイラに型定義ファイルを認識させる必要があります。型定義ファイルは、tsconfig.json
ファイルのinclude
オプションで指定するか、/// <reference path="..."/>
ディレクティブを使用して参照します。
10. TypeScriptとReact
TypeScriptは、Reactの開発においても非常に有用です。TypeScriptを使用することで、Reactコンポーネントの型を厳密に定義し、コンパイル時にエラーを検出することができます。
10.1 Reactコンポーネントの型定義
TypeScriptでは、ReactコンポーネントのPropsとStateの型を定義することができます。
“`typescript
interface MyComponentProps {
name: string;
age: number;
}
interface MyComponentState {
count: number;
}
class MyComponent extends React.Component
constructor(props: MyComponentProps) {
super(props);
this.state = { count: 0 };
}
render() {
return (
Hello, {this.props.name}!
Age: {this.props.age}
Count: {this.state.count}
);
}
}
“`
10.2 関数型コンポーネントの型定義
TypeScriptでは、関数型コンポーネントのPropsの型を定義することができます。
“`typescript
interface MyFunctionalComponentProps {
message: string;
}
const MyFunctionalComponent: React.FC
return (
{message}
);
};
“`
10.3 React Hooksの型定義
TypeScriptでは、React Hooksの型を定義することができます。
“`typescript
import { useState } from ‘react’;
interface CounterProps {
initialCount: number;
}
const Counter: React.FC
const [count, setCount] = useState
return (
Count: {count}
);
};
“`
11. TypeScriptとVue.js
TypeScriptは、Vue.jsの開発においても非常に有用です。TypeScriptを使用することで、Vueコンポーネントの型を厳密に定義し、コンパイル時にエラーを検出することができます。
11.1 Vueコンポーネントの型定義
TypeScriptでは、VueコンポーネントのProps、Data、Computed、Methodsの型を定義することができます。
“`typescript
import Vue from ‘vue’;
import { Component, Prop } from ‘vue-property-decorator’;
@Component
export default class MyComponent extends Vue {
@Prop({ type: String, required: true }) message!: string;
count: number = 0;
increment() {
this.count++;
}
}
“`
11.2 Vuexの型定義
TypeScriptでは、Vuexストアの型を定義することができます。
“`typescript
import Vue from ‘vue’;
import Vuex from ‘vuex’;
Vue.use(Vuex);
interface State {
count: number;
}
const store = new Vuex.Store
state: {
count: 0
},
mutations: {
increment(state: State) {
state.count++;
}
},
actions: {
increment({ commit }) {
commit(‘increment’);
}
},
getters: {
count: (state: State) => state.count
}
});
export default store;
“`
12. TypeScriptの高度な型
TypeScriptには、高度な型機能が多数用意されています。これらの機能を活用することで、より柔軟で型安全なコードを書くことができます。
12.1 ユニオン型
ユニオン型は、複数の型のいずれかを表す型です。
“`typescript
type Result = number | string;
function processResult(result: Result) {
if (typeof result === ‘number’) {
console.log(Result is a number: ${result}
);
} else {
console.log(Result is a string: ${result}
);
}
}
processResult(123); // Result is a number: 123
processResult(‘hello’); // Result is a string: hello
“`
12.2 インターセクション型
インターセクション型は、複数の型を組み合わせた型です。
“`typescript
interface Colorful {
color: string;
}
interface Circle {
radius: number;
}
type ColorfulCircle = Colorful & Circle;
const circle: ColorfulCircle = {
color: ‘red’,
radius: 10
};
console.log(Color: ${circle.color}, Radius: ${circle.radius}
);
“`
12.3 Conditional Types (条件型)
条件型は、条件に基づいて型を選択する機能です。
“`typescript
type IsString
type Result1 = IsString
type Result2 = IsString
“`
12.4 Mapped Types (マップ型)
マップ型は、既存の型を基に新しい型を生成する機能です。
“`typescript
interface Person {
name: string;
age: number;
address?: string;
}
type ReadonlyPerson = Readonly
type PartialPerson = Partial
type RequiredPerson = Required
type PickedPerson = Pick
type OmittedPerson = Omit
“`
12.5 Type Inference (型推論)
TypeScriptは、型アノテーションがなくても、初期値や文脈から型を推論することができます。
typescript
let x = 3; // xはnumber型として推論される
let y = "hello"; // yはstring型として推論される
12.6 Type Guards (型ガード)
型ガードは、実行時に変数の型を絞り込むための機能です。
“`typescript
interface Bird {
fly(): void;
layEggs(): void;
}
interface Fish {
swim(): void;
layEggs(): void;
}
function isBird(pet: Bird | Fish): pet is Bird {
return (pet as Bird).fly !== undefined;
}
function getSmallPet(): Fish | Bird {
// …
return {fly: () => {}, layEggs: () => {}}; //仮実装
}
let pet = getSmallPet();
if (isBird(pet)) {
pet.fly();
} else {
pet.swim();
}
“`
13. まとめ
この記事では、TypeScriptの基本から応用までを網羅的に解説しました。TypeScriptは、JavaScript開発をレベルアップさせるための強力なツールであり、大規模なプロジェクトや複雑なアプリケーションを開発する際に、その恩恵を最大限に受けることができます。
TypeScriptの型システム、オブジェクト指向プログラミング、ジェネリクス、モジュール、高度な型機能などを理解し、活用することで、より安全で保守性の高いコードを書くことができるようになります。
TypeScriptを積極的に導入し、JavaScript開発の効率性と品質を向上させてください。
この詳細な記事が、あなたのTypeScript学習の一助となれば幸いです。