<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>TypeScript | ビズドットオンライン</title>
	<atom:link href="https://it-biz.online/category/web-design/typescript/feed/" rel="self" type="application/rss+xml" />
	<link>https://it-biz.online</link>
	<description></description>
	<lastBuildDate>Wed, 23 Apr 2025 07:31:02 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>

<image>
	<url>https://it-biz.online/wp-content/uploads/2019/10/cropped-4a332f05ade4ac7bb3c46c472cb5eac8-32x32.png</url>
	<title>TypeScript | ビズドットオンライン</title>
	<link>https://it-biz.online</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【Angular】ルーティングの仕組みを１からわかりやすく</title>
		<link>https://it-biz.online/web-design/angular-routing/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Mon, 18 Mar 2024 08:19:12 +0000</pubDate>
				<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[WEBデザイン]]></category>
		<category><![CDATA[Angular]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9010</guid>

					<description><![CDATA[Angularのルーティングは、シングルページアプリケーション（SPA）でのページ遷移を管理する重要な機能です。 目次 Angular：ルーティングとは？Angularでのルーティング設定Angular：&#60;rout [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><a href="https://it-biz.online/web-design/what-is-angular/">Angular</a>のルーティングは、シングルページアプリケーション（SPA）での<strong><span class="marker-under">ページ遷移を管理する重要な機能</span></strong>です。</p>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">Angularにおける「ルーティング」とは？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>Angularにおけるルーティングとはアプリケーション内でユーザーが異なるページやセクションに移動する際の道案内のようなもの。Angularでは実際にページを「移動する」のではなく「<strong>ページの内容を書き換える</strong>」ことでページが遷移したかのように見せる技術を採用しています。</p>
</div></dd></dl></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>？？？となってしまった方でも１から理解できるように前提の前提から理解できるようにわかりやすく解説します。</p>
</div></div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Angular：ルーティングとは？</a></li><li><a href="#toc2" tabindex="0">Angularでのルーティング設定</a></li><li><a href="#toc3" tabindex="0">Angular：&lt;router-outlet&gt;とは何か？</a></li><li><a href="#toc4" tabindex="0">ナビゲーションとリンク</a><ol><li><a href="#toc5" tabindex="0">ナビゲーションリンク（routerLinkディレクティブ）</a></li><li><a href="#toc6" tabindex="0">プログラムによるナビゲーション（Routerサービス）</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">Angular：ルーティングとは？</span></h2>



<p>Angularのルーティングは、<strong>Webアプリケーション内でのページ遷移（＝実際にはページを遷移するのではなく、今見ているページの内容を書き換える）を制御する仕組み</strong>。</p>



<figure class="wp-block-image aligncenter size-full"><img fetchpriority="high" decoding="async" width="643" height="478" src="https://it-biz.online/wp-content/uploads/2024/03/image-20.png" alt="Angular ルーティング" class="wp-image-9022" srcset="https://it-biz.online/wp-content/uploads/2024/03/image-20.png 643w, https://it-biz.online/wp-content/uploads/2024/03/image-20-500x372.png 500w, https://it-biz.online/wp-content/uploads/2024/03/image-20-300x223.png 300w" sizes="(max-width: 643px) 100vw, 643px" /><figcaption class="wp-element-caption">図1：ルーティングイメージ</figcaption></figure>



<p>通常のWebアプリケーションでは複数のページ（ユーザ情報表示用ページ、トップページ、レポートページなど）があり、リンクをたどることでそれぞれのページに遷移していくのですが、AngularはSPA（<strong>シングルページ</strong>アプリケーション）なのでそのような動作はしません。</p>



<p>シングルページアプリケーション（SPA）では、従来のWebサイトのようにページを全て読み込み直して表示するのではなく、必要なデータやコンポーネントのみを動的に読み込むことでページの内容を更新します。つまり、ここでいう「ページ遷移」とは、実際にはページをまたいで移動するのではなく、<strong><span class="marker-under">単一のページ内で表示内容を切り替えることを指します。</span></strong></p>



<p>この方法を採用することで、リンクをクリックするたびに発生する全画面の読み込みを待つことなく、<strong>ほぼ即座に新しいコンテンツを見ることができるようになります</strong>。また、このページ遷移のプロセスはブラウザの履歴管理と連携しているので、ユーザーがブラウザの「戻る」や「進む」ボタンを使用しても、適切なコンテンツが表示されるようにできている点が特徴です。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>Angularでは別のページに移動しているわけではなく、１つのページ内で表示を変えている！ってのを理解できればOKです。</p>
</div></div>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box not-nested-style cocoon-block-tab-caption-box"><div class="tab-caption-box-label block-box-label box-label fab-lightbulb"><span class="tab-caption-box-label-text block-box-label-text box-label-text">ネットワークのルーティングとの違い</span></div><div class="tab-caption-box-content block-box-content box-content">
<p>ネットワークのルーティングはインターネットやその他のネットワーク上でデータパケットが目的地に到達するための最適な経路を選択するプロセス。</p>



<p>これに対して、Angularのルーティングは、Webアプリケーション内の異なるビュー間の移動を管理するためのもので、主にクライアントサイド（ユーザーのブラウザ上）で処理されます。</p>
</div></div>



<p>それでは、ここから具体的な実装方法を見ていきます。Angularではどのようにページ遷移を実現しているのか？という点に注目してください。</p>



<h2 class="wp-block-heading"><span id="toc2">Angularでのルーティング設定</span></h2>



<p>Angularでのルーティング設定を４ステップにわけて説明します。ざっくり言うと、ルーティング用のモジュール（ここにはURLと表示するコンポーネントの紐づけ情報を保持）を作って、そのモジュールをアプリケーションモジュールにImportするという手順です。</p>



<p class="is-style-border-left-box has-box-style"><span class="badge-green">ステップ１</span>　<strong>ルーティングモジュールの作成</strong></p>



<p>Angular CLIを使用して、ルーティングモジュールを作成します。このモジュールは、ルート（<strong>URLパターンとそれに対応する<a href="https://it-biz.online/web-design/ng-generate-component/">Angularコンポーネント</a>のマッピング</strong>）の定義を保持します。</p>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">Angular CLIとは？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>Angularアプリケーションの開発を助けるためのコマンドラインツール。Angular CLIは、新しいプロジェクトの生成、アプリケーションの開発サーバーの起動、コードのテスト、アプリケーションのビルドやデプロイなど、開発プロセスの多くの側面を自動化し、簡単に行えるように設計されています。</p>
</div></dd></dl></div>



<p>コマンドは以下の通り。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">ng generate module app-routing --flat --module=app</pre>



<ol class="wp-block-list">
<li><span class="bold-blue"><code>--flat</code>フラグ</span>
<ul class="wp-block-list">
<li class="is-style-bottom-margin-1em has-bottom-margin">新しいフォルダを作成せずにファイルをプロジェクトのルートに直接置くことを指定。</li>
</ul>
</li>



<li><code><span class="bold-blue">--module=app</span></code>
<ul class="wp-block-list">
<li>新しく生成されたルーティングモジュールをアプリケーションのルートモジュールに自動的にインポートするように指定。</li>
</ul>
</li>
</ol>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>このフラグは必要に応じて書き換えてください。</p>
</div></div>



<p class="is-style-border-left-box has-box-style"><span class="badge-green">ステップ２</span>　<strong>ルートの定義</strong></p>



<p>ルーティングモジュール（例: <code>app-routing.module.ts</code>）内で、<code><span class="blue">Routes</span></code>型の配列を定義し、各ルートを設定します。<code><span class="blue">Routes</span></code>型は<code><strong><span class="marker-under">@angular/router</span></strong></code>からインポートされます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { Routes, RouterModule } from '@angular/router';
import { HomeComponent } from './home/home.component'; // 例としてHomeComponentをインポート
import { AboutComponent } from './about/about.component'; // AboutComponentも例として

const routes: Routes = [
  { path: 'home', component: HomeComponent },
  { path: 'about', component: AboutComponent },
  // その他のルート定義...
];</pre>



<p>↑の配列は<code><span class="blue">path</span></code>と<code><span class="blue">component</span></code>プロパティを持ちます。<code><span class="blue">path</span></code>はURLの一部。<code><span class="blue">component</span></code>にはそのURLが指定されたときに表示されるコンポーネントを指定します。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>/home を含むURLを押したときに「HomeComponent」を表示するよ！ということ。</p>
</div></div>



<p class="is-style-border-left-box has-box-style"><span class="badge-green">ステップ３</span>　<strong>RouterModuleのインポートと設定</strong></p>



<p>次に、<code><span class="blue">RouterModule</span></code>をルーティングモジュールにインポートし、<code>forRoot()</code>メソッドを使ってアプリケーションのルートルートを設定します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }</pre>



<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin"><code><span class="blue">imports</span></code>配列で<code><span class="blue">RouterModule.forRoot(routes)</span></code>を呼び出すことにより、先ほど定義したルートがアプリケーションに登録されます。</li>



<li><code><span class="blue">exports</span></code>配列に<code><span class="blue">RouterModule</span></code>を含めることで、ルーティング機能がアプリケーションの他の部分から利用可能になります。</li>
</ul>



<p class="is-style-border-left-box has-box-style"><span class="badge-green">ステップ４</span>　<strong>アプリケーションモジュールにルーティングモジュールをインポート</strong></p>



<p>最後に、<code><span class="blue">AppRoutingModule</span></code>をアプリケーションのルートモジュール（通常は<code>app.module.ts</code>）にインポートします。これは、Angular CLIを使用してルーティングモジュールを生成した場合、自動的に行われることが多いですが、手動で行う必要がある場合もあります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { AppRoutingModule } from './app-routing.module'; // AppRoutingModuleのインポート

@NgModule({
  // ...
  imports: [
    // ...
    AppRoutingModule // ルーティングモジュールをインポート
  ],
  // ...
})
export class AppModule { }</pre>



<p>これで、ルーティングの基本設定は完了。実はそんなに難しいことはしていません。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>が、Angularのルーティングはここからが本番です。ページを切り替えたときにどのコンポーネントを表示するか？は決まったものの、どこに表示するか？を決められていません。</p>
</div></div>



<p>続いては、ルーターアウトレット（<code><strong><span class="marker-under">router-outlet</span></strong></code>）についてご説明します。</p>



<h2 class="wp-block-heading"><span id="toc3">Angular：&lt;router-outlet&gt;とは何か？</span></h2>



<p><code>&lt;router-outlet&gt;</code>は、テンプレート内に配置されるディレクティブ（指示子）で、<strong><span class="marker-under">Angularが動的にコンポーネントを表示する場所</span></strong>を表します。</p>



<p>つまり、URLに基づいて、コンポーネントをこの<code>&lt;router-outlet&gt;</code>の場所に読み込む役割を持ちます。</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="560" height="342" src="https://it-biz.online/wp-content/uploads/2024/03/image-21.png" alt="Angular router-outlet" class="wp-image-9023" srcset="https://it-biz.online/wp-content/uploads/2024/03/image-21.png 560w, https://it-biz.online/wp-content/uploads/2024/03/image-21-500x305.png 500w, https://it-biz.online/wp-content/uploads/2024/03/image-21-300x183.png 300w" sizes="(max-width: 560px) 100vw, 560px" /><figcaption class="wp-element-caption">図2：Angular router-outlet</figcaption></figure>



<p class="has-text-align-center"><span class="badge-blue">サンプルコード</span>　<strong>router-outlet</strong></p>



<p><code><span class="blue">app-routing.module.ts</span></code>に、2つのコンポーネントへのルートを定義。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { AboutComponent } from './about/about.component';

const routes: Routes = [
  { path: 'home', component: HomeComponent },
  { path: 'about', component: AboutComponent },
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }</pre>



<p><code><span class="blue">app.component.html</span></code>（または任意のテンプレートファイル）に<code><span class="blue">&lt;router-outlet&gt;</span></code>を配置。これにより、ルートに応じてコンポーネントがこの場所に表示されます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!-- ナビゲーションリンク -->
&lt;nav>
  &lt;ul>
    &lt;li>&lt;a routerLink="/home">Home&lt;/a>&lt;/li>
    &lt;li>&lt;a routerLink="/about">About&lt;/a>&lt;/li>
  &lt;/ul>
&lt;/nav>

&lt;!-- ルートコンポーネントが表示される場所 -->
&lt;router-outlet>&lt;/router-outlet></pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>上記の例では、ブラウザで<code>/home</code>や<code>/about</code>にアクセスすると、<code>&lt;router-outlet&gt;</code>の位置に対応するコンポーネントが表示されるということです。</p>
</div></div>



<p><code>&lt;router-outlet&gt;</code>がAngularアプリケーションにおけるルーティングとビューの管理の中心であることが理解できましたか？実際には、さらに多くのルートや複雑なナビゲーション構造を設定することができますが、基本的な考え方は同じ。</p>



<p><code>&lt;router-outlet&gt;</code>は、Angularでのルーティングシステムにおいて、動的にコンポーネントを表示する場所を指定するディレクティブ。アプリケーションのナビゲーションに従って、指定されたコンポーネントをこの場所に読み込み、表示します。</p>



<h2 class="wp-block-heading"><span id="toc4">ナビゲーションとリンク</span></h2>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>最後にリンクの設定方法を解説します。</p>
</div></div>



<p>ルーティングモジュール（コンポーネントとURLの紐づけ）、ルーターアウトレット（コンポーネントの表示領域）の設定が完了したら、あとは画面上に上記のURLを配置していくだけ。ただし、普通にHTMLの<a href="https://it-biz.online/web-design/link/">aタグ</a>を配置するだけでは不十分です。</p>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">なぜ、aタグでリンクを貼るだけではだめなのでしょうか。</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>従来の<code>&lt;a&gt;</code>タグを使用してWebページ間でリンクを作成すると、リンク先のページへ移動する際にブラウザは現在のページをアンロードし、<span class="marker-under">新しいページを完全に読み込むため</span>。（＝SPAとしてのメリットが享受できない）</p>
</div></dd></dl></div>



<p>Angularでは、ページ遷移を実現するために、ディレクティブとプログラム的な方法の両方を提供しています。ここでは、両方の方法を使ってナビゲーションを実装する方法について詳しく見ていきましょう。</p>



<h3 class="wp-block-heading"><span id="toc5">ナビゲーションリンク（routerLinkディレクティブ）</span></h3>



<p>Angularでは、テンプレート内で<code><span class="blue">&lt;a&gt;</span></code>タグに<code><span class="blue">routerLink</span></code>ディレクティブを使用して、ナビゲーションリンクを簡単に作成することができます。<code>routerLink</code>は、<strong><span class="marker-under">ユーザーがリンクをクリックしたときに遷移するパスを指定</span></strong>します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;nav>
  &lt;ul>
    &lt;li>&lt;a routerLink="/home">Home&lt;/a>&lt;/li>
    &lt;li>&lt;a routerLink="/about">About&lt;/a>&lt;/li>
  &lt;/ul>
&lt;/nav></pre>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/web-design/nav/">navタグ</a> / <a href="https://it-biz.online/web-design/list/">リストタグ</a></p>



<p>このサンプルコードでは、ホームページ(<code>/home</code>)と詳細ページ(<code>/about</code>)へのリンクを含むナビゲーションバーを作成しています。ユーザーがこれらのリンクのいずれかをクリックすると、指定されたパスに対応するコンポーネントを<code>&lt;router-outlet&gt;</code>に表示します。</p>



<h3 class="wp-block-heading"><span id="toc6">プログラムによるナビゲーション（Routerサービス）</span></h3>



<p>Angularでは、<code><span class="blue">Router</span></code>サービスをインジェクトしてプログラムによるナビゲーションを実装することもできます。これは、ユーザーがフォームを送信した後や、特定のイベントが発生したときなど、コード内から直接ページ遷移をトリガーする場合に便利です。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ちょっと難しいですが、実際のコードを見てみましょう。コンポーネントクラス内で<code>Router</code>サービスを使う方法は以下の通り。</p>
</div></div>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { Component } from '@angular/core';
import { Router } from '@angular/router';

@Component({
  selector: 'app-example',
  templateUrl: './example.component.html',
})
export class ExampleComponent {
  constructor(private router: Router) {}

  navigateToHome() {
    this.router.navigate(['/home']);
  }
}</pre>



<p>そして、テンプレート内で、このメソッドをイベント（例えば、ボタンクリック）にバインドします。↓の例では、<code><span class="blue">navigateToHome</span></code>メソッドがボタンクリックイベントにバインドされているので、このメソッドが実行されると、アプリケーションは<code>/home</code>パスに遷移させます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;button (click)="navigateToHome()">Go to Home&lt;/button></pre>



<p>最後にAngularにおけるルーティングの基本知識を表形式で整理します。自分の理解が十分であるかどうか？チェックしておきましょう。</p>



<figure class="wp-block-table"><div class="scrollable-table stfc-sticky"><table><thead><tr><th>項目</th><th>説明</th></tr></thead><tbody><tr><td><strong>ルーティングとは</strong></td><td>URLとコンポーネントをマッピングし、アプリケーション内のナビゲーションを管理する仕組み。</td></tr><tr><td><strong>RouterModule</strong></td><td>Angularのルーティングを管理するためのモジュール。<code>@angular/router</code>からインポートする。</td></tr><tr><td><strong>Routes</strong></td><td>アプリケーション内の各ルート（パスとコンポーネントのマッピング）を定義する配列。</td></tr><tr><td><strong>routerLink</strong></td><td>テンプレート内でリンクを作成し、ユーザーが異なるコンポーネント間をナビゲートできるようにするディレクティブ。</td></tr><tr><td><strong>&lt;router-outlet&gt;</strong></td><td>ルートに応じてコンポーネントが表示される場所をテンプレート内に指定するディレクティブ。</td></tr><tr><td><strong>Router</strong></td><td>プログラムによるナビゲーションを実行するためのサービス。コンポーネント内で<code>navigate</code>や<code>navigateByUrl</code>メソッドを使用。</td></tr></tbody></table></div></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Angular：モジュール@NgModuleの基本を１からわかりやすく</title>
		<link>https://it-biz.online/web-design/ngmodule/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Mon, 11 Mar 2024 09:47:12 +0000</pubDate>
				<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[WEBデザイン]]></category>
		<category><![CDATA[Angular]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=8995</guid>

					<description><![CDATA[@NgModuleはAngularでモジュールを作成する際の宣言文のような役割を果たすデコレータです。@NgModuleを用いることで指定したクラスがモジュールであることを明示的に宣言します。 このページでは、Angul [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><code><span class="bold-blue">@NgModule</span></code>はAngularで<strong><span class="marker-under">モジュールを作成する際の宣言文のような役割を果たすデコレータ</span></strong>です。<code><span class="bold-blue">@NgModule</span></code>を用いることで指定したクラスがモジュールであることを明示的に宣言します。</p>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">モジュールとは？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>モジュールとは関連するコードの集まりのこと。Angularにおけるモジュールは、<a href="https://it-biz.online/web-design/ng-generate-component/">コンポーネント</a>、サービス、ディレクティブ、パイプなど、アプリケーションを構成する部品をまとめる役割を担います。</p>
</div></dd></dl></div>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// 必要なAngularのコアモジュールをインポート
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

// アプリケーションが使用するコンポーネントをインポート
import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent // アプリケーションのコンポーネントを宣言
  ],
  imports: [
    BrowserModule // ブラウザで動作するアプリケーションに必要なモジュールをインポート
  ],
  providers: [], // サービスプロバイダー
  bootstrap: [AppComponent] // アプリケーションのルートコンポーネントを指定
})
export class AppModule { }</pre>



<p>このページでは、Angular初心者の方向けにそもそもモジュールとは何か？という初歩の初歩から解説し、<code><span class="bold-blue">@NgModule</span></code>の意味と基本的な使い方を１からわかりやすくサンプルコード付きで解説します。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Angularのモジュールとは？</a><ol><li><a href="#toc2" tabindex="0">モジュールの必要性</a></li></ol></li><li><a href="#toc3" tabindex="0">Angular：@NgModuleデコレータ</a><ol><li><a href="#toc4" tabindex="0">@NgModuleの構文ルール</a></li><li><a href="#toc5" tabindex="0">@NgModuleデコレータのプロパティ</a></li></ol></li><li><a href="#toc6" tabindex="0">モジュールの使用</a><ol><li><a href="#toc7" tabindex="0">ステップ1: 機能モジュールの作成</a></li><li><a href="#toc8" tabindex="0">ステップ2: モジュールの利用</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">Angularのモジュールとは？</span></h2>



<p>Angularのモジュールは、<strong>レゴブロックのセット</strong>のようなものです。</p>



<p>レゴは１つひとつの小さなブロックを組み合わせて様々なものを組み立てていきますよね。たとえば、家を作る時には、窓のブロック、ドアのブロック、屋根のブロックなど、それぞれのパーツを組み合わせることで１つの家を作り上げることができます。<br>レゴブロックに家を組み立てるためのブロックセットがあるように、Webページの一部分を作るために必要な「コンポーネント」や「サービス」などのパーツを１つにまとめたものとして、Angularの<strong>モジュール</strong>が存在します。</p>



<p>例えば、「プロフィールページ」というモジュールがあるとすると、このモジュールには「ユーザーの写真を表示するパーツ」「ユーザーの名前を表示するパーツ」「連絡先を表示するパーツ」などが含まれるかもしれません。これらのパーツを１つにまとめたものが「プロフィールページモジュール」です。</p>



<h3 class="wp-block-heading"><span id="toc2">モジュールの必要性</span></h3>



<p>大きなレゴの城を組み立てるとき、0から100までの全部を一度に組み立てようとすると大変です。（土台から天守閣までの一度に作成しようとすると、作業中に「いまは何をしていたっけ？」というように混乱してしまう・・・）</p>



<p>しかし、城の一部分ごとにセットを分けて、それぞれのセットを別々に組み立ててから、最後に全部をつなげるともっと簡単にできます。まずは、土台を作り、次に1階部分、2階部分として作成し、最後にそれぞれのブロックを連結させて作った方が簡単です。</p>



<p>Angularのモジュールも同じで、Webアプリケーションをいろいろなモジュール（セット）に分けることで、ひとつひとつをシンプルに作っていくことができます。そして、全部のモジュールが完成したら、それをつなげて一つの大きなWebアプリケーションを完成させるようなイメージです。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>このモジュールを作成するために利用するのが<code><span class="bold-blue">@NgModule</span></code>です。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc3">Angular：@NgModuleデコレータ</span></h2>



<p><code><strong><span class="bold-blue">@NgModule</span></strong></code>はAngularの<strong>デコレータ</strong>の一種で、<strong><span class="marker-under">指定したクラスをAngularモジュールとして識別</span></strong>する役割を担います。モジュールのメタデータをAngularフレームワークに提供するために使用され、モジュールの振る舞いを定義します。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://it-biz.online/web-design/typescript-decorator/" title="【TypeScript】デコレータ＠とは？1分でわかりやすく解説" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="320" height="180" src="https://it-biz.online/wp-content/uploads/2025/04/image-17-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-biz.online/wp-content/uploads/2025/04/image-17-320x180.png 320w, https://it-biz.online/wp-content/uploads/2025/04/image-17-240x135.png 240w, https://it-biz.online/wp-content/uploads/2025/04/image-17-640x360.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【TypeScript】デコレータ＠とは？1分でわかりやすく解説</div><div class="blogcard-snippet internal-blogcard-snippet">Angularのデコレータは、コードをより宣言的で簡潔にし、フレームワークの機能を効果的に活用するための強力なツールです。この記事で紹介した主要なデコレータを理解することで、Angularアプリケーションの開発がよりスムーズに進むはずです。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-biz.online" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-biz.online</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.04.23</div></div></div></div></a>
</div></figure>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">モジュールのメタデータとは？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>メタデータには、モジュールに属するコンポーネント、インポートされる他のモジュール、提供するサービス、アプリケーションの起動時に最初にロードするコンポーネントなどが含まれます。<code>@NgModule</code>を使用することで、アプリケーションの構造をAngularに伝え、依存関係の注入、コンポーネントのスコープ、再利用可能な機能のグループ化などを実現します。</p>
</div></dd></dl></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ひとまずここでは「<strong>モジュールはいろんな部品をまとめた１つの箱</strong>」のようなイメージを持てればOK。</p>
</div></div>



<p>言葉だけで説明されても、中々イメージは湧かないと思いますので、早速モジュールの作成方法～利用方法までをサンプルコード付きで解説していきます。</p>



<h3 class="wp-block-heading"><span id="toc4">@NgModuleの構文ルール</span></h3>



<p><code>@NgModule</code>デコレータは、クラス定義の直前に配置。デコレータは次のように使用します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@NgModule({
  // プロパティ: 値
})
export class MyModule {}</pre>



<h3 class="wp-block-heading"><span id="toc5">@NgModuleデコレータのプロパティ</span></h3>



<figure class="wp-block-table"><div class="scrollable-table stfc-sticky"><table><thead><tr><th>プロパティ</th><th>説明</th></tr></thead><tbody><tr><td><code>declarations</code></td><td>モジュール内で使用されるコンポーネント、ディレクティブ、パイプを宣言。<br>これらはモジュール内でのみ参照可能。</td></tr><tr><td><code>imports</code></td><td>現在のモジュールで必要とされる他のモジュールを指定。<br>→インポートされたモジュールのコンポーネント、ディレクティブなどを使用できるようになる。</td></tr><tr><td><code>exports</code></td><td>他のモジュールで使用できるようにするコンポーネント、ディレクティブ、パイプを指定。<br>これらは<code>declarations</code>で宣言されたもののサブセット。</td></tr><tr><td><code>providers</code></td><td>モジュールで使用されるサービスのプロバイダーを指定。→サービスがモジュール内のすべてのコンポーネントで利用可能になります。</td></tr><tr><td><code>bootstrap</code></td><td>アプリケーションの起動時にインスタンス化されるルートコンポーネントを指定。このプロパティは主にルートモジュールで使用される。</td></tr><tr><td><code>schemas</code></td><td>テンプレートで使用されるカスタム要素や属性を許可するために使用。例えば、<code>NO_ERRORS_SCHEMA</code>や<code>CUSTOM_ELEMENTS_SCHEMA</code>があります。</td></tr><tr><td><code>id</code></td><td>モジュールのIDを指定します。これは通常、遅延ロードされるモジュールに使用されます。</td></tr></tbody></table></div></figure>



<p>これらのプロパティを使用して、Angularモジュールを定義し、アプリケーションの構造を整理することができます。</p>



<p class="has-text-align-center"><span class="badge-green">サンプルコード</span>　<strong>Angularモジュールの作成例</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// 必要なAngularのコアモジュールをインポート
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

// アプリケーションが使用するコンポーネントをインポート
import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent // アプリケーションのコンポーネントを宣言
  ],
  imports: [
    BrowserModule // ブラウザで動作するアプリケーションに必要なモジュールをインポート
  ],
  providers: [], // サービスプロバイダー（ここでは空）
  bootstrap: [AppComponent] // アプリケーションのルートコンポーネントを指定
})
export class AppModule { }</pre>



<p><code>AppModule</code>はAngularのルートモジュールとして機能し、アプリケーションで最初にロードされるモジュールです。<code>declarations</code>には、このモジュールが直接使用する<code>AppComponent</code>が含まれています。<code>imports</code>には、アプリケーションがブラウザで動作するために必要な<code>BrowserModule</code>が含まれています。<code>bootstrap</code>には、アプリケーションの起動時に最初にロードされるコンポーネントが指定されています。</p>



<h2 class="wp-block-heading"><span id="toc6">モジュールの使用</span></h2>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ここからは、具体的な例を用いて実際にモジュールを定義する方法を見ていきましょう。</p>
</div></div>



<p class="has-text-align-center is-style-clip-box has-box-style"><strong>サンプルシナリオ</strong></p>



<p>アプリケーションに「ユーザー管理機能」と「注文管理機能」があるとします。これらの機能をそれぞれ別のモジュールで管理することにしました。<code><span class="bold-blue">UserModule</span></code>と<code><span class="bold-blue">OrderModule</span></code>を作成し、それぞれに関連するコンポーネントやサービスをグループ化します。</p>



<h3 class="wp-block-heading"><span id="toc7">ステップ1: 機能モジュールの作成</span></h3>



<p><code>UserModule</code>には、ユーザー一覧を表示する<code><span class="bold-blue">UserListComponent</span></code>とユーザーの詳細を表示する<code><span class="bold-blue">UserDetailComponent</span></code>を含めます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// src/app/user/user.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { UserListComponent } from './user-list.component';
import { UserDetailComponent } from './user-detail.component';

@NgModule({
  declarations: [UserListComponent, UserDetailComponent],
  imports: [CommonModule],
  exports: [UserListComponent] // UserListComponentを外部に公開
})
export class UserModule {}</pre>



<p>同様に、<code><span class="bold-blue">OrderModule</span></code>には注文一覧を表示する<code><span class="bold-blue">OrderListComponent</span></code>を含めます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// src/app/order/order.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { OrderListComponent } from './order-list.component';

@NgModule({
  declarations: [OrderListComponent],
  imports: [CommonModule],
  exports: [OrderListComponent] // OrderListComponentを外部に公開
})
export class OrderModule {}</pre>



<h3 class="wp-block-heading"><span id="toc8">ステップ2: モジュールの利用</span></h3>



<p><code>AppModule</code>（ルートモジュール）で<code>UserModule</code>と<code>OrderModule</code>を利用することにします。これにより、アプリケーション全体でユーザー管理と注文管理の機能が使えるようになります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// src/app/app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { UserModule } from './user/user.module'; // UserModuleをインポート
import { OrderModule } from './order/order.module'; // OrderModuleをインポート

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    UserModule, // AppModuleにUserModuleを追加
    OrderModule // AppModuleにOrderModuleを追加
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }</pre>



<p>このように、<strong>Angularモジュールは「呼び出し」されるものではなく</strong>、アプリケーションの構造を定義し、コードを機能単位で整理するために「利用」されます。ルートモジュール（<code>AppModule</code>）または他の機能モジュール内でモジュールをインポートすることにより、そのモジュールが提供する機能（コンポーネント、サービスなど）をアプリケーションの他の部分で使用できるようになります。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<p class="has-text-align-center"><span class="badge-green">まとめ</span>　<strong>モジュールとは？</strong></p>



<ul class="wp-block-list">
<li>アプリケーションの一部を機能ごとにまとめたコードの集合体。</li>



<li>コンポーネント、サービス、ディレクティブ、パイプなどをグループ化し、機能単位で管理する。</li>



<li>アプリケーションの構造を整理し、コードの再利用性とメンテナンス性を向上させる。</li>
</ul>



<p class="has-text-align-center"><span class="badge-green">まとめ</span>　<strong><code>@NgModule</code>とは？</strong></p>



<ul class="wp-block-list">
<li>Angularのデコレーターで、クラスをAngularモジュールとして識別する。</li>



<li>モジュールのメタデータを定義し、コンポーネントのスコープや依存関係の注入を管理する。</li>



<li>アプリケーションの起動時に最初にロードするコンポーネント（bootstrap）、他のモジュールから利用可能にするエクスポート（exports）など、モジュールの振る舞いをAngularに伝える。</li>
</ul>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【TypeScript】デコレータ＠とは？1分でわかりやすく解説</title>
		<link>https://it-biz.online/web-design/typescript-decorator/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Wed, 23 Apr 2025 06:30:25 +0000</pubDate>
				<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[WEBデザイン]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=10364</guid>

					<description><![CDATA[TypeScriptにおけるデコレータは、クラスやそのメンバーに対し、宣言的にメタデータを付与する機能です。このメタデータは、クラスの特性や振る舞いを外部から修飾するために利用されます。このページでは、TypeScrip [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>TypeScriptにおけるデコレータは、<strong><span class="marker-under">クラスやそのメンバーに対し、宣言的にメタデータを付与する機能</span></strong>です。このメタデータは、クラスの特性や振る舞いを外部から修飾するために利用されます。このページでは、TypeScriptのデコレータの基本概念から応用までを解説し、コードの柔軟性と表現力を高める可能性を探ります。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<p>ざっくり説明すると「デコレータ」とは・・・</p>



<p><strong>「データについてのデータ」</strong> を付加するための仕組み。もう少し具体的に言うと、</p>



<ul class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li class="is-style-bottom-margin-2em has-bottom-margin">クラスやメソッド、プロパティといったコードの要素が、<strong>どのような特性を持つか</strong>（例えば、読み取り専用である、特定のイベントをリッスンする、Angularのコンポーネントであるなど）</li>



<li>それらが<strong>どのように振る舞うべきか</strong>（例えば、特定の処理を行う前にログを出力する、親コンポーネントからデータを受け取るなど）</li>
</ul>



<p>といった情報をコード自身に付加するものです。デコレータは、このメタデータをコードに付与するための仕組み、と考えると良いでしょう。</p>
</div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">デコレータとは？コードへの注釈による機能拡張</a><ol><li><a href="#toc2" tabindex="0">TypeScriptにおけるデコレータの利点：表現力と保守性の向上</a></li></ol></li><li><a href="#toc3" tabindex="0">TypeScriptの主要なデコレータの種類と機能</a><ol><li><a href="#toc4" tabindex="0">1. クラスデコレータ</a></li><li><a href="#toc5" tabindex="0">2. メソッドデコレータ</a></li><li><a href="#toc6" tabindex="0">3. プロパティデコレータ</a></li><li><a href="#toc7" tabindex="0">4. パラメータデコレータ</a></li></ol></li><li><a href="#toc8" tabindex="0">デコレータの動作原理：メタデータの利用</a></li><li><a href="#toc9" tabindex="0">Angularにおけるデコレータの応用：フレームワークの基礎構造</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">デコレータとは？コードへの注釈による機能拡張</span></h2>



<p>デコレータは、クラス、メソッド、プロパティ、パラメータに対して付与される特殊な構文です。<code><span class="bold-blue">@</span></code> 記号に続いてデコレータ名を記述することで、<strong><span class="marker-under">対象となるコード要素に対する注釈</span></strong>として機能し、TypeScriptコンパイラや関連フレームワークに対し、その要素の特性や振る舞いに関する情報を提供することになります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">function sealed(constructor: Function) {
  Object.seal(constructor);
  Object.seal(constructor.prototype);
}

// ↓がデコレータ
@sealed
class MyClass {
  constructor(public name: string) {}
  greet() {
    console.log(`Hello, ${this.name}!`);
  }
}</pre>



<h3 class="wp-block-heading"><span id="toc2">TypeScriptにおけるデコレータの利点：表現力と保守性の向上</span></h3>



<p>TypeScriptでデコレータを活用することには、複数の利点があります。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>使いこなしていくうちに徐々にメリットを感じていけると思いますが、事前に簡単に利点を整理しておきます。</p>
</div></div>



<ul class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>メタプログラミングの実現</strong><br>プログラム自身がその構造や実行時の振る舞いを操作するメタプログラミングを可能にする。</li>



<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>関心事の分離</strong><br>ログ記録、認証、トランザクション管理といった横断的な関心事を、主要なビジネスロジックから分離し、コードの可読性と保守性を高めることができる。</li>



<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>コードの再利用性</strong><br>一度定義されたデコレータは、複数のクラスやメンバーに適用でき、重複したコードを削減できる。</li>



<li><strong>フレームワークとの統合</strong><br><a href="https://it-biz.online/web-design/what-is-angular/">Angular</a>などのフレームワークは、デコレータを基盤としており、フレームワークの機能利用を簡潔化します。</li>
</ul>



<h2 class="wp-block-heading"><span id="toc3">TypeScriptの主要なデコレータの種類と機能</span></h2>



<p>TypeScriptは、デコレータが適用される対象に応じて、以下の種類を提供します。</p>



<h3 class="wp-block-heading"><span id="toc4">1. クラスデコレータ</span></h3>



<p>クラス定義の直前に記述され、クラス全体の振る舞いを変更、またはメタデータを付与します。クラスデコレータは、クラスのコンストラクタ関数を引数として受け取ります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">function sealed(constructor: Function) {
  Object.seal(constructor);
  Object.seal(constructor.prototype);
}

@sealed
class MyClass {
  constructor(public name: string) {}
  greet() {
    console.log(`Hello, ${this.name}!`);
  }
}

const instance = new MyClass("TypeScript");
instance.greet(); // 出力結果：Hello, TypeScript!</pre>



<h3 class="wp-block-heading"><span id="toc5">2. メソッドデコレータ</span></h3>



<p>メソッド定義の直前に記述され、メソッドの振る舞いを修飾、またはメタデータを付与します。メソッドデコレータは、ターゲットオブジェクト、メソッド名、プロパティ記述子を引数として受け取ります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">function logMethod(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
  const originalMethod = descriptor.value;
  descriptor.value = function(...args: any[]) {
    console.log(`メソッド '${propertyKey}' が引数 ${JSON.stringify(args)} で呼び出されました。`);
    const result = originalMethod.apply(this, args);
    console.log(`メソッド '${propertyKey}' の実行結果: ${result}`);
    return result;
  };
  return descriptor;
}

class Calculator {
  @logMethod
  add(a: number, b: number): number {
    return a + b;
  }
}

const calc = new Calculator();
const sum = calc.add(5, 3);
console.log(`合計: ${sum}`);
// 出力結果：
// メソッド 'add' が引数 [5,3] で呼び出されました。
// メソッド 'add' の実行結果: 8
// 合計: 8</pre>



<h3 class="wp-block-heading"><span id="toc6">3. プロパティデコレータ</span></h3>



<p>プロパティ定義の直前に記述され、プロパティのメタデータを付与、またはアクセス時の振る舞いを変更します。プロパティデコレータは、ターゲットオブジェクトとプロパティ名を引数として受け取ります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">function readonly(target: any, propertyKey: string) {
  Object.defineProperty(target, propertyKey, {
    writable: false
  });
}

class Person {
  @readonly
  name: string = "John Doe";

  constructor() {}
}

const person = new Person();
console.log(person.name); // 出力結果：John Doe
// person.name = "Jane Doe"; // コンパイルエラーが発生します</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">function readonly(target: any, propertyKey: string) {
  Object.defineProperty(target, propertyKey, {
    writable: false
  });
}

class Person {
  @readonly
  name: string = "John Doe";

  constructor() {}
}</pre>



<h3 class="wp-block-heading"><span id="toc7">4. パラメータデコレータ</span></h3>



<p>メソッドのパラメータ定義の直前に記述され、パラメータに関するメタデータを付与します。パラメータデコレータは、ターゲットオブジェクト、メソッド名、パラメータのインデックスを引数として受け取ります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">function paramInfo(target: any, methodKey: string, parameterIndex: number) {
  console.log(`クラス '${target.constructor.name}' のメソッド '${methodKey}' のインデックス ${parameterIndex} 番目のパラメータです。`);
}

class Greeter {
  greet(@paramInfo message: string) {
    console.log(`Greeting: ${message}`);
  }
}

const greeter = new Greeter();
greeter.greet("Hello!");
// 出力結果：
// クラス 'Greeter' のメソッド 'greet' のインデックス 0 番目のパラメータです。
// Greeting: Hello!</pre>



<h2 class="wp-block-heading"><span id="toc8">デコレータの動作原理：メタデータの利用</span></h2>



<p>TypeScriptコンパイラは、デコレータを<strong>特別な関数として処理</strong>し、デコレートされた要素に関する情報を引数としてデコレータ関数に渡します。</p>



<p>デコレータ関数は、この情報に基づいて、クラスやメンバーの振る舞いを変更したり、メタデータを格納したりします。このメタデータは、TypeScriptランタイムやフレームワークがコードの構造と意図を解釈し、適切な処理を実行するために利用されます。</p>



<h2 class="wp-block-heading"><span id="toc9">Angularにおけるデコレータの応用：フレームワークの基礎構造</span></h2>



<p>Angularフレームワークは、TypeScriptのデコレータ機能を広範に活用しています。</p>



<p><code>@Component</code>、<code>@Directive</code>、<code>@Injectable</code>、<code>@Input</code>、<code>@Output</code> などのAngularデコレータは、クラスに特定の役割と機能を持たせるための重要なメカニズムです。例えば、<code>@Component</code> デコレータは、TypeScriptクラスをUIコンポーネントとして定義し、テンプレートやスタイルといった関連情報をAngularに提供します。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TypeScript超入門：本当に最初の第１歩から</title>
		<link>https://it-biz.online/web-design/typescript-start/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Tue, 22 Apr 2025 12:00:00 +0000</pubDate>
				<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[WEBデザイン]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=10352</guid>

					<description><![CDATA[この記事では、プログラミング言語「TypeScript」の基本的な文法を、プログラミング自体が初めての方や、まだ慣れていない方にもわかるように、本当に基本的なところから順を追って解説します。 目次 プログラミングの超基本 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>この記事では、プログラミング言語「<a href="https://it-biz.online/web-design/typescript-abc/">TypeScript</a>」の基本的な文法を、プログラミング自体が初めての方や、まだ慣れていない方にもわかるように、本当に基本的なところから順を追って解説します。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>深堀りしていくと、深い話も尽きないのがどのプログラミング言語にも共通する特徴ですが、まずはその土台としての解説ページです！是非最後までご覧ください。</p>
</div></div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8" checked><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">プログラミングの超基本：「文」と「セミコロン」</a><ol><li><a href="#toc2" tabindex="0">セミコロン ; の役割</a></li><li><a href="#toc3" tabindex="0">Tips：セミコロンは省略できる？</a></li></ol></li><li><a href="#toc4" tabindex="0">TypeScriptとは？</a><ol><li><a href="#toc5" tabindex="0">なぜ型が必要なの？</a></li></ol></li><li><a href="#toc6" tabindex="0">基本的な「値」と「型」</a></li><li><a href="#toc7" tabindex="0">値を覚えておく：「変数」</a><ol><li><a href="#toc8" tabindex="0">型推論 (Type Inference)</a></li></ol></li><li><a href="#toc9" tabindex="0">値を作り出す：「式」</a><ol><li><a href="#toc10" tabindex="0">文と式の違い</a></li></ol></li><li><a href="#toc11" tabindex="0">処理をまとめる：「関数」</a><ol><li><a href="#toc12" tabindex="0">アロー関数</a></li></ol></li><li><a href="#toc13" tabindex="0">オブジェクトの形を決める：「インターフェース」</a></li><li><a href="#toc14" tabindex="0">オブジェクトの設計図と機能：「クラス」</a></li><li><a href="#toc15" tabindex="0">型に別名を付ける：「型エイリアス」</a></li><li><a href="#toc16" tabindex="0">型を引数にする：「ジェネリクス」</a></li><li><a href="#toc17" tabindex="0">コードの説明書き：「コメント」</a></li><li><a href="#toc18" tabindex="0">TypeScript：文法まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">プログラミングの超基本：「文」と「セミコロン」</span></h2>



<p>どんなプログラミング言語にも共通しますが、プログラムはコンピューターに対する<strong>指示の集まり</strong>でできています。この１つ１つの指示のことを<strong>文 (Statement)</strong> と呼びます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// これは「変数 message を宣言し、"Hello" という文字列を代入する」という１つの文
let message: string = "Hello";

// これも「変数 year を宣言し、2025 という数値を代入する」という別の１つの文
let year: number = 2025;

// これも「コンソールに message 変数の内容を表示する」という文
console.log(message);
</pre>



<p>プログラムは、これらの文が上から順に実行されることで動きます。</p>



<h3 class="wp-block-heading"><span id="toc2">セミコロン ; の役割</span></h3>



<p>多くのプログラミング言語では、文の終わりを明確にするために<strong>セミコロン (<code>;</code>)</strong> を付けます。TypeScript（および元になったJavaScript）でも、文の終わりにはセミコロンを付けるのが基本的なルールです。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">let greeting: string = "Good morning"; // 文の終わりにセミコロン
let count: number = 10;             // 文の終わりにセミコロン
console.log(greeting);             // 文の終わりにセミコロン
</pre>



<h3 class="wp-block-heading"><span id="toc3">Tips：セミコロンは省略できる？</span></h3>



<p>実は、TypeScript (JavaScript) では、多くの場合、行の終わりが文の終わりであると自動的に判断してくれるため、セミコロンを省略しても動くことがあります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">let city: string = "Tokyo" // セミコロンなしでもOK
let population: number = 14000000 // セミコロンなしでもOK
console.log(city)           // セミコロンなしでもOK
</pre>



<p>しかし、以下のような理由から、<strong>基本的にはセミコロンを付けることが推奨</strong>されています。</p>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>意図しない動作を防ぐ</strong><br>特定の状況では、セミコロンがないとコードが予期せぬ形で結合され、エラーやバグの原因になることがあります。</li>



<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>コードの明確性</strong><br>文の終わりが明確になり、コードが読みやすくなります。</li>



<li><strong>チーム開発での一貫性</strong><br>複数人で開発する場合、セミコロンを付けるか付けないかのルールを統一しておくと、コードのスタイルが揃います。</li>
</ol>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p><strong>上記を踏まえ、この入門記事では原則として文の終わりにはセミコロンを付けるようにします。</strong></p>
</div>



<h2 class="wp-block-heading"><span id="toc4">TypeScriptとは？</span></h2>



<p>さて、本題のTypeScriptです。<br>TypeScriptは、Microsoftによって開発された、JavaScriptを拡張して作られたプログラミング言語です。一番大きな特徴は<strong>静的型付け</strong>ができることです。</p>



<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>JavaScriptのスーパーセット</strong><br>TypeScriptは<a href="https://it-biz.online/web-design/js-rule/">JavaScript</a>の機能をすべて含んでいます。つまり、JavaScriptを知っていれば、TypeScriptは比較的スムーズに学べます！</li>



<li><strong>静的型付け</strong><br>プログラムを実行する前に、データ（後述する「値」や「変数」）に「型」（種類）を指定することで、型の間違いを早期に発見できます。これがコードの品質を高め、開発を助けてくれます。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc5">なぜ型が必要なの？</span></h3>



<p>コンピューターは、「数値」と「文字列（文字の並び）」を区別します。<br>例えば、<code><span class="blue">100</span></code> は数値、<code><span class="green">"100"</span></code> は文字列です。</p>



<p>JavaScriptでは、実行時に型が決まるため、意図せず数値と文字列を足し合わせてしまうようなミスが起こりえます（例: <code>1 + "0"</code> が <code>"10"</code> になる）。TypeScriptでは、あらかじめ「これは数値だよ」「これは文字列だよ」と宣言することで、そのようなミスを防ぎます。</p>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/it-skills/data_type/">「データ型」とは？</a></p>



<h2 class="wp-block-heading"><span id="toc6">基本的な「値」と「型」</span></h2>



<p>プログラムが扱うデータの基本的な単位を<strong>値 (Value)</strong> と呼びます。値には様々な種類があり、その種類のことを<strong>型 (Type)</strong> と言います。</p>



<p>TypeScriptでよく使う基本的な型を見ていきましょう。</p>



<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin"><strong><code>string</code> (文字列型)</strong><br>文字や文章を表す値の型です。ダブルクォーテーション <code>"</code> またはシングルクォーテーション <code>'</code> で囲みます。
<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin">値の例: <code>"こんにちは"</code>, <code>'TypeScript'</code>, <code>"123"</code> (これは数値ではなく文字列)</li>
</ul>
</li>



<li class="is-style-bottom-margin-2em has-bottom-margin"><strong><code>number</code> (数値型)</strong><br>整数や小数を表す値の型です。
<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin">値の例: <code>100</code>, <code>0</code>, <code>-5</code>, <code>3.14</code></li>
</ul>
</li>



<li class="is-style-bottom-margin-2em has-bottom-margin"><strong><code>boolean</code> (真偽値型)</strong><br>「正しい (<code>true</code>)」か「間違っている (<code>false</code>)」かの二択を表す値の型です。
<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin">値の例: <code>true</code>, <code>false</code></li>
</ul>
</li>



<li class="is-style-bottom-margin-2em has-bottom-margin"><strong><code>Array</code> (配列型)</strong><br>同じ型の値を複数まとめて順番に格納する型です。角括弧 <code>[]</code> を使います。
<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin">値の例: <code>[1, 2, 3]</code> (数値の配列), <code>["apple", "banana"]</code> (文字列の配列)</li>
</ul>
</li>



<li class="is-style-bottom-margin-2em has-bottom-margin"><strong><code>null</code></strong><br>「何もない」ことを意図的に示す特殊な値。</li>



<li class="is-style-bottom-margin-2em has-bottom-margin"><strong><code>undefined</code></strong><br>値が「未定義」であることを示す特殊な値。変数を宣言しただけで、まだ値を入れていない状態など。</li>



<li><strong><code>any</code> (任意型)</strong><br>どんな型の値でも入る特殊な型。<br>便利ですが、TypeScriptの型チェックの恩恵を受けられなくなるため、<strong><span class="marker-under">使用は慎重に</span></strong>。</li>
</ul>



<h2 class="wp-block-heading"><span id="toc7">値を覚えておく：「変数」</span></h2>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="658" height="282" src="https://it-biz.online/wp-content/uploads/2019/12/image-73.png" alt="プログラミング 変数とは" class="wp-image-2917" srcset="https://it-biz.online/wp-content/uploads/2019/12/image-73.png 658w, https://it-biz.online/wp-content/uploads/2019/12/image-73-300x129.png 300w, https://it-biz.online/wp-content/uploads/2019/12/image-73-500x214.png 500w, https://it-biz.online/wp-content/uploads/2019/12/image-73-304x130.png 304w" sizes="(max-width: 658px) 100vw, 658px" /><figcaption class="wp-element-caption">図1：変数とは？</figcaption></figure>



<p>プログラムの中で、値を一時的に保存しておくための「名前付きの箱」のようなものが<strong>変数 (Variable)</strong> です。変数を使うことで、値に名前を付けて何度も利用したり、値を変更したりできます。</p>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/it-skills/variable/">プログラミングの変数とは？１分でわかりやすく</a></p>



<p>変数を使うには、まず<strong>宣言 (Declaration)</strong> が必要です。TypeScriptでは <code><span class="blue">let</span></code> または <code><span class="blue">const</span></code> を使って変数を宣言します。</p>



<ul class="wp-block-list">
<li><strong><code>let</code>:</strong> 値を後から<strong>変更可能</strong>な変数を宣言します。</li>



<li><strong><code>const</code>:</strong> 値を後から<strong>変更不可能</strong>な（<strong>定数</strong> Constant）変数を宣言します。基本的には <code>const</code> を使い、値の変更が必要な場合のみ <code>let</code> を使うのが良い習慣です。</li>
</ul>



<p>宣言の際には、変数名の後に <span class="bold-blue"><code>:</code> </span>(コロン) と<strong>型名</strong>を指定しその変数にどんな型の値を入れるかを指定します（<strong>型注釈</strong> Type Annotation）。そして <span class="bold-blue"><code>=</code> </span>の後に、その変数に入れる最初の値（<strong>初期値</strong>）を書きます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// string 型の変数 message を宣言し、初期値として "Hello, TypeScript!" を入れる
let message: string = "Hello, TypeScript!";

// number 型の定数 year を宣言し、初期値として 2025 を入れる
const year: number = 2025;

// boolean 型の変数 isActive を宣言し、初期値として true を入れる
let isActive: boolean = true;

// number 型の配列 scores を宣言
const scores: number[] = [80, 95, 72];

// message 変数の中身を "Hi!" に変更する (let なので変更可能)
message = "Hi!";

// year 変数の中身を変更しようとするとエラーになる (const なので変更不可)
// year = 2026; // エラー!

// 型が違う値を入れようとするとエラーになる
// message = 100; // エラー! message は string 型
</pre>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://it-biz.online/web-design/variavle-type/" title="TypeScript：変数と基本的な型を３分でわかりやすく解説" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-biz.online/wp-content/uploads/2024/03/image-8-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-biz.online/wp-content/uploads/2024/03/image-8-320x180.png 320w, https://it-biz.online/wp-content/uploads/2024/03/image-8-240x135.png 240w, https://it-biz.online/wp-content/uploads/2024/03/image-8-640x360.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">TypeScript：変数と基本的な型を３分でわかりやすく解説</div><div class="blogcard-snippet internal-blogcard-snippet">TypeScriptの変数宣言、基本的なデータ型（number, string, boolean, null, undefined, array, tuple, enumなど）の概要と使用方法を3分で簡潔に解説します。TypeScriptでの型注釈と型推論の基本もカバーし、初心者がTypeScriptの型システムを効果的に活用するための入門ガイド。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-biz.online" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-biz.online</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.03.08</div></div></div></div></a>
</div></figure>



<h3 class="wp-block-heading"><span id="toc8">型推論 (Type Inference)</span></h3>



<p>実は多くの場合、TypeScriptは初期値から変数の型を自動的に推測してくれます。これを<strong>型推論</strong>と呼びます。型推論が可能な場合は、型注釈を省略できます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">let user = "Alice"; // 初期値が文字列なので string 型と推論される
const pi = 3.14;    // 初期値が数値なので number 型と推論される

// user = 123; // エラー! user は string 型と推論されている
</pre>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p>型推論は便利ですが、以下のような場合に意図しない型が付与されたり、開発者の意図が明確に伝わりにくくなることがあります。</p>



<ul class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>初期化されていない変数</strong><br><code>let message;</code> のように初期値がない場合、<code>any</code> 型と推論されます。これは型チェックの恩恵を受けられない状態です。</li>



<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>複雑な条件分岐や関数</strong><br>返り値の型が複雑になる場合、型推論が期待通りにならないことがあります。</li>



<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>コードの可読性</strong><br>型が明示されている方が、変数や関数の役割が一目で理解しやすくなります。</li>



<li><strong>リファクタリング時の安全性</strong><br>型が明示されていることで、変更による影響範囲が明確になり、より安全にリファクタリングを進められます。</li>
</ul>



<p>そのため、特に<strong>関数の引数と返り値、複雑な処理を行う変数は、明示的に型注釈をつける</strong>ことが推奨されます。一方で、単純な変数の初期化時など、型推論が明確で意図通りに働く場合は、必ずしも型注釈が必要というわけではありません。</p>



<p><strong>バランスとしては、コードの可読性、保守性、安全性を考慮しつつ、型推論を適切に活用する</strong>のが良いでしょう。チーム開発においては、型付けのルールを統一することも重要になります。</p>
</div>



<h2 class="wp-block-heading"><span id="toc9">値を作り出す：「式」</span></h2>



<p>プログラムの中で、計算や処理を実行して<strong>最終的に１つの値になるもの</strong>を<strong><span class="marker-under">式 (Expression)</span></strong> と呼びます。</p>



<ul class="wp-block-list">
<li><code>1 + 2</code> は、計算されて <code>3</code> という値になるので式。</li>



<li><code>year</code> （上で宣言した変数）は、その中に入っている <code>2025</code> という値になるので式。</li>



<li><code>message</code> は、その中に入っている <code>"Hi!"</code> という値になるので式。</li>



<li><code>scores[0]</code> は、配列 <code>scores</code> の最初の要素である <code>80</code> という値になるので式。</li>



<li><code>isActive === true</code> は、比較の結果 <code>true</code> または <code>false</code> という値になるので式。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc10">文と式の違い</span></h3>



<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>文 (Statement)</strong><br>コンピューターへの指示。何かを実行させる。<br>例: <span class="blue"><code>let x = 10;</code>, <code>console.log("OK");</code></span></li>



<li><strong>式 (Expression)</strong><br>評価されると１つの値になるもの。<br>例: <span class="blue"><code>10</code>, <code>x</code>, <code>10 + 5</code>, <code>x &gt; 5</code></span></li>
</ul>



<p>文の中に式が含まれていることがよくあります。例えば、<code><span class="blue">let x = 10 + 5;</span></code> という文には、<code><span class="green">10 + 5</span></code> という式が含まれています。この式が評価されて <code>15</code> という値になり、その値が変数 <code>x</code> に代入されます。</p>



<h2 class="wp-block-heading"><span id="toc11">処理をまとめる：「関数」</span></h2>



<p>一連の処理をまとめて名前を付け、繰り返し呼び出せるようにしたものが<strong>関数 (Function)</strong> です。関数を使うことで、同じようなコードを何度も書く手間が省け、プログラムが整理されます。</p>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/it-skills/function-abc/">プログラミングの「関数」とは？</a></p>



<p>関数を定義するには <code><span class="blue">function</span></code> キーワードを使います。関数には<strong>引数 (Argument/Parameter)</strong> を渡すことができ、処理の結果として<strong>戻り値 (Return Value)</strong> を返すことができます。</p>



<p>TypeScriptでは、関数の引数と戻り値にも型注釈を付けます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// 関数宣言の基本形
// function 関数名(引数1: 型, 引数2: 型, ...): 戻り値の型 {
//   // 関数の処理
//   return 戻り値; // 戻り値がある場合
// }

// ２つの数値を受け取り、合計を返す関数
function add(a: number, b: number): number {
  const result: number = a + b; // a + b は式
  return result;             // result を戻り値として返す文
}

// 戻り値がない (何かを表示するだけなど) 関数の戻り値の型は `void`
function printMessage(message: string): void {
  console.log(message); // message を表示する文
  // return 文がない、または return; だけ
}

// 関数を呼び出す (実行する)
const sum: number = add(5, 3); // add関数を呼び出し、戻り値 (8) を変数 sum に代入する文
console.log(sum); // 出力: 8

printMessage("関数のテスト"); // printMessage関数を呼び出す文 (出力: 関数のテスト)
</pre>



<h3 class="wp-block-heading"><span id="toc12">アロー関数</span></h3>



<p>JavaScriptでお馴染みの、より簡潔に関数を書く方法である<strong>アロー関数</strong>も使えます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// アロー関数の基本形
// const 関数名 = (引数1: 型, 引数2: 型, ...): 戻り値の型 => {
//   // 関数の処理
//   return 戻り値;
// };

const multiply = (x: number, y: number): number => {
  return x * y;
};

// 処理が1行で終わる場合は {} と return を省略可
const difference = (a: number, b: number): number => a - b;

const resultMultiply: number = multiply(4, 6); // 24
const resultDifference: number = difference(10, 7); // 3

console.log(resultMultiply);
console.log(resultDifference);
</pre>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://it-biz.online/web-design/typescript-function/" title="TypeScript：関数宣言/関数式の基本を１分でわかりやすく" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-biz.online/wp-content/uploads/2024/03/image-9-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-biz.online/wp-content/uploads/2024/03/image-9-320x180.png 320w, https://it-biz.online/wp-content/uploads/2024/03/image-9-240x135.png 240w, https://it-biz.online/wp-content/uploads/2024/03/image-9-640x360.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">TypeScript：関数宣言/関数式の基本を１分でわかりやすく</div><div class="blogcard-snippet internal-blogcard-snippet">TypeScriptでの関数の基本的な定義方法、実行方法、さらにジェネリック型、高階関数、オーバーロード、タプルとデストラクチャリングを使った応用的な使い方までをわかりやすく解説しています。TypeScriptの型安全性を活かした関数の使いこなし方を学び、より安全で再利用可能なコードの書き方をマスターしましょう。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-biz.online" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-biz.online</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.01.10</div></div></div></div></a>
</div></figure>



<h2 class="wp-block-heading"><span id="toc13">オブジェクトの形を決める：「インターフェース」</span></h2>



<p>複数の値をまとめて、１つの意味のあるデータとして扱いたい場合があります。例えば、「ユーザー」を表すデータとして、ID、名前、メールアドレスなどをまとめたい、といった場合です。このようなデータのまとまりを<strong>オブジェクト (Object)</strong> と呼びます。（オブジェクトについては、次の章で解説します。）</p>



<p><strong>インターフェース (Interface)</strong> は、オブジェクトがどのようなプロパティ（オブジェクト内の個々のデータのこと）を持つべきか、その「形」や「構造」を定義するための設計図のようなものです。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// User というインターフェース (設計図) を定義
interface User {
  id: number;     // id という名前のプロパティがあり、その型は number
  name: string;    // name という名前のプロパティがあり、その型は string
  isAdmin: boolean; // isAdmin という名前のプロパティがあり、その型は boolean
  email?: string; // ? を付けると、あってもなくても良いプロパティ (オプショナル)
}

// User インターフェースに従ったオブジェクトを作成
// このオブジェクトは User の設計図通りに作られている
let user1: User = {
  id: 1,
  name: "David",
  isAdmin: true,
  email: "david@example.com"
};

// email プロパティがなくても User インターフェースを満たす
let user2: User = {
  id: 2,
  name: "Eve",
  isAdmin: false
};

// インターフェースで定義されていないプロパティを持っていたり、
// 必須のプロパティがなかったりするとエラーになる
// let user3: User = {
     id: 3, 
     username: "Frank"
}; // エラー: nameがない、username は未定義

// 関数が User 型のオブジェクトを受け取ることを明示できる
function displayUserName(user: User): void {
  console.log(user.name);
}

displayUserName(user1); // 出力: David
displayUserName(user2); // 出力: Eve
</pre>



<p>インターフェースを使うことで、「このオブジェクトには必ず <code>id</code> と <code>name</code> が <code>number</code> 型と <code>string</code> 型で存在する」といったルールを明確にでき、コードの安全性が高まります。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://it-biz.online/web-design/interface/" title="TypeScript：interface（インターフェース）の基本を３分で解説" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-biz.online/wp-content/uploads/2024/03/image-12-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-biz.online/wp-content/uploads/2024/03/image-12-320x180.png 320w, https://it-biz.online/wp-content/uploads/2024/03/image-12-240x135.png 240w, https://it-biz.online/wp-content/uploads/2024/03/image-12-640x360.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">TypeScript：interface（インターフェース）の基本を３分で解説</div><div class="blogcard-snippet internal-blogcard-snippet">TypeScriptのインターフェースの基本から応用までを徹底解説。初心者でも理解しやすいように、インターフェースの定義方法、利点、関数やクラスとの連携、さらには宣言のマージについても具体的な例を交えて紹介。TypeScriptでの型安全なコーディングをマスターしたい方必見の内容です。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-biz.online" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-biz.online</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.01.17</div></div></div></div></a>
</div></figure>



<h2 class="wp-block-heading"><span id="toc14">オブジェクトの設計図と機能：「クラス」</span></h2>



<p>インターフェースがオブジェクトの「形」だけを定義するのに対し、<strong>クラス (Class)</strong> はオブジェクトの「形」（プロパティ）に加えて、そのオブジェクトが持つ「機能」（<strong>メソッド</strong> Method と呼ばれる関数）も一緒に定義できる、より高機能な設計図です。オブジェクト指向プログラミングの中心的な概念です。</p>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/web-design/typescript-calss/">Typescriptのオブジェクトとは？</a></p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Product {
  // プロパティ (クラスが持つデータ)
  name: string;
  price: number;
  readonly id: number; // readonly: 一度設定したら変更できない

  // コンストラクタ: クラスからオブジェクトを生成するときに自動的に呼ばれる特殊なメソッド
  // プロパティの初期化などを行う
  constructor(id: number, name: string, price: number) {
    this.id = id; // this は生成されるオブジェクト自身を指す
    this.name = name;
    this.price = price;
    console.log(`商品「${this.name}」が生成されました。`);
  }

  // メソッド (クラスが持つ機能・関数)
  getPriceWithTax(taxRate: number): number {
    // 税込み価格を計算して返す
    return this.price * (1 + taxRate);
  }
}

// クラス (設計図) から実際のオブジェクト (インスタンス) を生成する
const productA = new Product(101, "高機能マウス", 5000); // コンストラクタが呼ばれる
const productB = new Product(102, "キーボード", 8000);

// オブジェクトのプロパティにアクセス
console.log(productA.name); // 出力: 高機能マウス
console.log(productB.price); // 出力: 8000

// オブジェクトのメソッドを呼び出す
const priceAWithTax = productA.getPriceWithTax(0.1); // 税率10%
console.log(`商品Aの税込価格: ${priceAWithTax}円`); // 出力: 商品Aの税込価格: 5500円

// readonly なプロパティは変更できない
// productA.id = 200; // エラー!
</pre>



<p>クラスを使うと、関連するデータ（プロパティ）と処理（メソッド）をひとまとめにして管理できるため、複雑なプログラムを構造化しやすくなります。</p>



<h2 class="wp-block-heading"><span id="toc15">型に別名を付ける：「型エイリアス」</span></h2>



<p>複雑な型や何度も使う型に、分かりやすい別名を付けることができるのが<strong>型エイリアス (Type Alias)</strong> です。<code>type</code> キーワードを使って定義します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// 文字列リテラルの組み合わせに 'Status' という別名を付ける
type Status = "pending" | "processing" | "completed" | "failed";
// Status 型の変数は、上記4つの文字列のどれかしか受け付けない

let orderStatus: Status = "processing";
console.log(orderStatus);

orderStatus = "completed";
// orderStatus = "shipped"; // エラー! Status 型には 'shipped' は含まれない

// オブジェクトの型にも別名を付けられる (インターフェースと似ている)
type Point = {
  x: number;
  y: number;
};

function distance(p1: Point, p2: Point): number {
  const dx = p1.x - p2.x;
  const dy = p1.y - p2.y;
  return Math.sqrt(dx * dx + dy * dy); // Math.sqrt は平方根を計算する組み込み関数
}

const point1: Point = { x: 0, y: 0 };
const point2: Point = { x: 3, y: 4 };
console.log(distance(point1, point2)); // 出力: 5

// 関数型に別名を付ける
type StringFormatter = (input: string) => string;

const toUpperCase: StringFormatter = (str) => str.toUpperCase();
const addGreeting: StringFormatter = (str) => `Hello, ${str}!`;

console.log(toUpperCase("test")); // 出力: TEST
console.log(addGreeting("World")); // 出力: Hello, World!
</pre>



<p>型エイリアスを使うと、コードが読みやすく、意図が伝わりやすくなります。</p>



<h2 class="wp-block-heading"><span id="toc16">型を引数にする：「ジェネリクス」</span></h2>



<p><strong>ジェネリクス (Generics)</strong> は、関数やクラスを定義するときに、そこで使われる型を固定せず、後から指定できるようにする仕組みです。→型を関数の引数のように扱えます。</p>



<p>これにより、様々な型に対応できる、再利用性の高いコードを書くことができます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// この関数は、呼び出すときに指定された型 T の配列を受け取り、
// その型の要素を返す（もし配列が空なら undefined を返す）
function getFirstItem&lt;T>(items: T[]): T | undefined {
  // T は型引数と呼ばれる。呼び出し時に具体的な型が決まる。
  return items.length > 0 ? items[0] : undefined;
}

// number 型を指定して呼び出す
const numbers: number[] = [10, 20, 30];
const firstNum: number | undefined = getFirstItem&lt;number>(numbers);
console.log(firstNum); // 出力: 10

// string 型を指定して呼び出す
const colors: string[] = ["red", "green", "blue"];
const firstColor: string | undefined = getFirstItem&lt;string>(colors);
console.log(firstColor); // 出力: red

// 型を省略すると、TypeScriptが推論してくれる場合もある
const flags = [true, false, true];
const firstFlag = getFirstItem(flags); // boolean 型だと推論される
console.log(firstFlag); // 出力: true

// 空の配列の場合
const emptyArray: any[] = [];
const firstEmpty = getFirstItem(emptyArray);
console.log(firstEmpty); // 出力: undefined
</pre>



<p>ジェネリクスは少し高度な概念ですが、ライブラリなどでは頻繁に使われているため、覚えておくと役立ちます。</p>



<h2 class="wp-block-heading"><span id="toc17">コードの説明書き：「コメント」</span></h2>



<p>コードの中に、プログラムの動作には影響しない説明文を書き残すことができます。これを<strong>コメント</strong>と呼びます。後で自分が見返したときや、他の人がコードを読むときに、処理内容を理解しやすくするために使います。</p>



<p>TypeScript (JavaScript) では、コメントの書き方は主に2種類あります。</p>



<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>一行コメント:</strong> <code><span class="bold-blue">//</span></code> から行末までがコメントになります。 TypeScript<code>// これは一行コメントです let price: number = 100; // 税抜き価格</code></li>



<li><strong>複数行コメント:</strong> <code><span class="bold-blue">/*</span></code> と <code><span class="bold-blue">*/</span></code> で囲まれた範囲がコメントになります。 TypeScript<code>/* これは複数行コメントです。 複数行にわたって説明を記述できます。 関数やクラスの説明などによく使われます。 */ function calculateTotal(price: number, quantity: number): number { // 消費税率 (10%) const taxRate = 0.1; const subTotal = price * quantity; const tax = subTotal * taxRate; return subTotal + tax; // 合計金額を返す }</code></li>
</ul>



<p>コメントのルールはJavaと同一です。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>適切なコメントは、コードの可読性を大きく向上させます。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc18">TypeScript：文法まとめ</span></h2>



<p>今回は、プログラミングの本当に基本的な「文」や「値」から始まり、TypeScriptのコアとなる「型」「変数」「関数」「インターフェース」「クラス」などの概念を駆け足で見てきました。</p>



<ul class="wp-block-list">
<li>プログラムは<strong>文</strong>の集まり。文末には<strong>セミコロン</strong> <code>;</code> を付けるのが基本。</li>



<li>データには<strong>値</strong>があり、その種類が<strong>型</strong>。</li>



<li>値を保存するのが<strong>変数</strong> (<code>let</code>, <code>const</code>)。型注釈と型推論がある。</li>



<li>値を生成するのが<strong>式</strong>。</li>



<li>処理をまとめるのが<strong>関数</strong>。引数と戻り値に型を付ける。</li>



<li>オブジェクトの形を定義するのが<strong>インターフェース</strong>。</li>



<li>形と機能を定義するのが<strong>クラス</strong>。</li>



<li>型に別名を付けるのが<strong>型エイリアス</strong>。</li>



<li>型を柔軟に扱うのが<strong>ジェネリクス</strong>。</li>



<li>コードの説明は<strong>コメント</strong>で。</li>
</ul>



<p>TypeScriptは、JavaScriptに「型」という強力な武器を与えてくれます。最初は覚えることが多く感じるかもしれませんが、型があることでエラーが減り、コードが読みやすくなり、安心して開発を進められるようになります。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ぜひ、ご自身の環境でTypeScriptをセットアップして、実際にコードを書いて動かしてみてください。公式ドキュメントや様々なチュートリアルも素晴らしい学習リソースです。</p>
</div></div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TypeScript入門: 基礎から最初のステップまでを３分で</title>
		<link>https://it-biz.online/web-design/typescript-abc/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Thu, 07 Mar 2024 12:00:00 +0000</pubDate>
				<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[WEBデザイン]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=8961</guid>

					<description><![CDATA[TypeScriptはMicrosoftによって開発されたオープンソースのプログラミング言語で、JavaScriptに静的型付けを加えた上位互換言語です。JavaScriptのすべての機能に加えて、型アノテーションやコン [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><strong>TypeScript</strong>はMicrosoftによって開発されたオープンソースのプログラミング言語で、<strong><span class="marker-under">JavaScriptに静的型付けを加えた上位互換言語</span></strong>です。JavaScriptのすべての機能に加えて、型アノテーションやコンパイル時の型チェック、インターフェース、ジェネリックス、名前空間、モジュールなどの機能を持っています。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>なので、<a href="https://it-biz.online/web-design/js-rule/">JavaScript</a>に対する基礎知識を持っているとある程度楽に学習を進めることができます。</p>
</div></div>



<p>TypeScriptで書いたコードは、TypeScriptコンパイラまたはBabelなどの<strong>トランスパイラ</strong>を使用してJavaScriptに変換→任意のブラウザや<a href="https://it-biz.online/web-design/node-js/]">Node.js</a>環境で実行することができます。手軽さや移行のしやすさから、現在多くのWebサイトがTypeScriptを用いて構築されています。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">function addNumbers(a: number, b: number): number {
    return a + b;
}

const sum = addNumbers(10, 5);
console.log(sum); // 出力: 15</pre>



<p>このページではTypeScriptの基本的な概念を解説します。<br>また、今後TypeScriptを使ってみたいと思う方のために、必要な環境設定から最初のTypeScriptファイルの作成方法に至るまで1個1個順を追ってご説明します。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-10" checked><label class="toc-title" for="toc-checkbox-10">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">TypeScriptとは</a><ol><li><a href="#toc2" tabindex="0">TypeScriptの特徴（Type：型）</a></li></ol></li><li><a href="#toc3" tabindex="0">TypeScriptの環境設定</a><ol><li><a href="#toc4" tabindex="0">Node.jsのインストール</a></li><li><a href="#toc5" tabindex="0">TypeScriptコンパイラのセットアップ</a></li><li><a href="#toc6" tabindex="0">IDEの設定</a></li></ol></li><li><a href="#toc7" tabindex="0">TypeScriptファイルの作成</a><ol><li><a href="#toc8" tabindex="0">TypeScriptファイルの作成</a></li><li><a href="#toc9" tabindex="0">tscコマンドによるトランスパイル</a></li><li><a href="#toc10" tabindex="0">実行結果の確認</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">TypeScriptとは</span></h2>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="681" height="272" src="https://it-biz.online/wp-content/uploads/2024/03/image-32.png" alt="" class="wp-image-10350" srcset="https://it-biz.online/wp-content/uploads/2024/03/image-32.png 681w, https://it-biz.online/wp-content/uploads/2024/03/image-32-500x200.png 500w, https://it-biz.online/wp-content/uploads/2024/03/image-32-300x120.png 300w" sizes="(max-width: 681px) 100vw, 681px" /></figure>



<p><strong>TypeScriptはJavaScriptの拡張版（＝進化版）</strong>としてMicrosoftにより開発されたプログラミング言語です。JavaScriptの弱点の一つであった「データ型」の問題を克服するために、<strong><span class="marker-under">静的型付け</span></strong>といった強力な型システムを加えることで、開発者がより安全に、かつ効率的にコードを記述できるようにすることを目的としています。</p>



<p>JavaScriptが、ブラウザやNode.jsなど広範囲にわたるプラットフォームでの動的なWebアプリケーション開発に不可欠な言語というのは変わりませんが、TypeScriptはその能力をさらに拡張し、大規模なアプリケーションの開発を容易にしているという点がポイントです。</p>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/web-design/node-js/">Node.jsとは？</a></p>



<h3 class="wp-block-heading"><span id="toc2">TypeScriptの特徴（Type：型）</span></h3>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>TypeScriptの核心機能は、その名が示す通り「Type：<strong>型</strong>」にあります。</p>
</div></div>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<p>静的型付け機能は、簡単に言えば、<strong>「この変数はこういう種類の値しか入れちゃダメだよ！」と事前に決めておくことで、間違いを防ぎ、より安全で分かりやすいコードを書けるようにする仕組み</strong>です。</p>
</div>



<p>この仕組みのおかげで、変数、関数の引数、戻り値などに<strong>明確な型を指定できる</strong>ため、開発の早い段階で型不一致やその他の一般的なエラーを検出することが可能になります。<strong><span class="marker-under">この型システムはオプショナル：任意の機能なので、JavaScriptのコードをそのままTypeScriptファイルにコピー＆ペーストして、段階的に型を導入することもできます。</span></strong></p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>また、<a href="https://it-biz.online/it-skills/ide/">IDE</a>やエディタの強力なサポートがあるので、リアルタイムのエラーチェック、コード補完、リファクタリングが容易に。→開発プロセスの生産性を大幅に向上させることが可能になります。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc3">TypeScriptの環境設定</span></h2>



<p>TypeScriptを利用するためには、まず開発環境を適切にセットアップする必要があります。このセクションでは、TypeScript開発のための基本的な環境設定手順を説明します。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>主に、Node.jsのインストール、TypeScriptコンパイラのセットアップ、そして開発効率を高めるための統合開発環境（IDE）の設定などをご説明します。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc4">Node.jsのインストール</span></h3>



<p>TypeScriptをコンパイルするには<a href="https://it-biz.online/web-design/node-js/">Node.js</a>が必要です。Node.jsは、サーバーサイドでJavaScriptを実行するためのランタイム環境であり、npm（Node Package Manager）が含まれています。npmとは、JavaScriptのライブラリやツールを管理するためのパッケージマネージャーのようなもの。</p>



<p>まずは、<a href="https://nodejs.org/">Node.jsの公式ウェブサイト</a>からインストーラをダウンロードし、指示に従ってNode.jsをインストールしてください。</p>



<h3 class="wp-block-heading"><span id="toc5">TypeScriptコンパイラのセットアップ</span></h3>



<p>Node.jsのインストールが完了したら、次はnpmを使用して<strong>TypeScriptコンパイラ</strong>をインストールします。コマンドラインまたはターミナルを開き、以下のコマンドを実行してください。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">npm install -g typescript</pre>



<p>このコマンドにより、TypeScriptコンパイラがグローバルにインストールされ、任意のプロジェクトで使用できるようになります。インストールが完了したら、以下のコマンドを実行してTypeScriptのバージョンを確認し、正しくインストールされていることを確認します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">tsc --version</pre>



<h3 class="wp-block-heading"><span id="toc6">IDEの設定</span></h3>



<p>TypeScriptの開発には、Visual Studio Code（VS Code）などのTypeScriptに対応したIDEを使用することをお勧めします。VS Codeは無料で提供されており、TypeScriptのコード補完、リファクタリング、エラーチェックなどの強力な機能を備えています。VS Codeをまだお持ちでない場合は、<a>Visual Studio Codeの公式ウェブサイト</a>からダウンロードしてインストールしましょう。</p>



<p>インストール後、VS Codeで新しいプロジェクトを開き、<code><span class="bold-blue">.ts</span></code>拡張子を持つファイルを作成すると、自動的にTypeScriptのサポートが有効になります。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>これで、TypeScriptの開発環境の基本的なセットアップが完了です。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc7">TypeScriptファイルの作成</span></h2>



<p>ここまでの章でTypeScriptの基本と環境設定の方法を解説してきました。ここからは、実際にTypeScriptを使って最初のファイルを作成し、それをJavaScriptに<strong>トランスパイル</strong>するプロセスを見ていきます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>このステップでは、TypeScriptの基本的な使い方を理解し、TypeScriptプロジェクトでの作業フローを体験していきます。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc8">TypeScriptファイルの作成</span></h3>



<p>まず、任意のテキストエディタまたはIDE（前述のVisual Studio Codeがお勧め）を使用して、新しいファイルを作成します。ファイル名は<code><span class="bold-blue">hello.ts</span></code>としましょう。このファイルに以下のTypeScriptコードを記述してください。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">function sayHello(name: string): string {
    return `Hello, ${name}!`;
}

const message = sayHello('TypeScript');
console.log(message);</pre>



<p>このコードは、与えられた名前に挨拶を返すシンプルな関数<code>sayHello</code>を定義しています。ここで、引数<code>name</code>と戻り値に<strong><span class="marker-under">型アノテーション<code>string</code></span></strong>を使用しています。これにより、関数が文字列型の引数を受け取り、文字列型の値を返すことがTypeScriptによって保証されます。</p>



<h3 class="wp-block-heading"><span id="toc9">tscコマンドによるトランスパイル</span></h3>



<p>次に、コマンドラインまたはターミナルを開き、<code>hello.ts</code>ファイルが保存されているディレクトリに移動します。次のコマンドを実行して、TypeScriptファイルをJavaScriptにトランスパイルしてください。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">tsc hello.ts</pre>



<p>このコマンドを実行すると、同じディレクトリに<code>hello.js</code>という新しいファイルが作成されます。このファイルには、<code>hello.ts</code>からトランスパイルされたJavaScriptコードが含まれています。TypeScriptコンパイラは、TypeScriptのコードを標準的なJavaScriptに変換することで、どのJavaScript環境でも実行できるようにします。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<p class="has-text-align-center"><span class="badge-green">ポイント</span>　<strong>トランスパイルとは？</strong></p>



<p><strong>トランスパイル（Transpile）</strong>は、ソースコードをあるプログラミング言語から別のプログラミング言語に変換するプロセスのこと。この用語は特に、互換性のある形式やより広範囲に対応するプラットフォーム向けにコードを変換する際に用いられます。</p>



<p>TypeScriptはJavaScriptに静的型付けやその他の機能を追加した上位集合言語ですが、ブラウザやNode.jsなどのJavaScript環境で実行するためには、標準的なJavaScriptコードに変換する必要があります。この変換プロセスを実行するのがTypeScriptコンパイラ（<code>tsc</code>コマンド）で、この作業をトランスパイルと呼びます。</p>
</div>



<h3 class="wp-block-heading"><span id="toc10">実行結果の確認</span></h3>



<p>最後に、トランスパイルされたJavaScriptファイルを実行してみましょう。次のコマンドを使用して、<code>hello.js</code>をNode.jsで実行します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">node hello.js</pre>



<p>コマンドを実行すると、コンソールに<code>Hello, TypeScript!</code>というメッセージが表示されます。これは、TypeScriptで書かれたコードが正しくJavaScriptに変換され、期待通りの結果を出力したことを意味します。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>これで、あなたはTypeScriptの基本的な使い方をマスターできました。</p>
</div></div>



<p>TypeScriptファイルの作成、トランスパイル、そして実行のプロセスを通じて、TypeScriptがどのように機能するかの基本的な理解を深めることができたかと思います。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<p class="has-text-align-center"><span class="badge-green">まとめ</span>　<strong>TypeScriptとは？</strong></p>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li class="is-style-bottom-margin-1em has-bottom-margin"><strong>上位互換言語</strong>
<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin">TypeScriptはJavaScriptに対して上位互換性を持つプログラミング言語。</li>
</ul>
</li>



<li class="is-style-bottom-margin-1em has-bottom-margin"><strong>静的型付け</strong>
<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin">コードの安全性と信頼性を高めるために、変数や関数の引数、戻り値に型を指定できる。</li>
</ul>
</li>



<li class="is-style-bottom-margin-1em has-bottom-margin"><strong>開発効率の向上</strong>
<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin">IDEとの連携により、コード補完やエラーチェックがリアルタイムで行われ、開発プロセスがスムーズになる。</li>
</ul>
</li>



<li class="is-style-bottom-margin-1em has-bottom-margin"><strong>大規模開発向け</strong>
<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin">型システムやモジュール管理などの機能により、大規模なアプリケーション開発が容易になる。</li>
</ul>
</li>



<li class="is-style-bottom-margin-1em has-bottom-margin"><strong>JavaScriptとの高い互換性</strong>
<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin">既存のJavaScriptコードをTypeScriptに徐々に移行することが可能。</li>
</ul>
</li>



<li><strong>オープンソース</strong>
<ul class="wp-block-list">
<li>Microsoftによって開発され、コミュニティのサポートによって継続的に改善されています。</li>
</ul>
</li>
</ol>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Angular：パイプとは？初心者向けにわかりやすく３分で解説</title>
		<link>https://it-biz.online/web-design/angular-pipe/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Fri, 17 Jan 2025 15:57:42 +0000</pubDate>
				<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[WEBデザイン]]></category>
		<category><![CDATA[Angular]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9585</guid>

					<description><![CDATA[パイプ (Pipe) とは何か？ Angularにおけるパイプ (Pipe) は、テンプレート内で表示するデータを「見た目」や「形式」の観点から変換・加工する仕組みです。このページでは、初心者向けのイメージと、仕組みの本 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>パイプ (Pipe) とは何か？</p>



<p>Angularにおけるパイプ (Pipe) は、テンプレート内で表示するデータを「見た目」や「形式」の観点から変換・加工する仕組みです。このページでは、初心者向けのイメージと、仕組みの本質的な部分を段階的に解説していきます。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-12" checked><label class="toc-title" for="toc-checkbox-12">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">パイプ (Pipe) とは何か？</a><ol><li><a href="#toc2" tabindex="0">パイプの目的・役割</a></li><li><a href="#toc3" tabindex="0">パイプを使うには</a></li></ol></li><li><a href="#toc4" tabindex="0">初心者がつかむべき「イメージ」と簡単な利用シーン</a><ol><li><a href="#toc5" tabindex="0">単純なビルトインパイプの利用例</a></li><li><a href="#toc6" tabindex="0">複数パイプの連続利用</a></li></ol></li><li><a href="#toc7" tabindex="0">カスタムパイプの基本と概念</a><ol><li><a href="#toc8" tabindex="0">カスタムパイプの最小構成</a></li></ol></li><li><a href="#toc9" tabindex="0">Change Detection (変更検知) との関係</a><ol><li><a href="#toc10" tabindex="0">(1) Angular における変更検知</a></li><li><a href="#toc11" tabindex="0">(2) 純粋パイプと非純粋パイプ</a></li></ol></li><li><a href="#toc12" tabindex="0">具体的な利用シーンとコード例</a><ol><li><a href="#toc13" tabindex="0">シーン1: ユーザー一覧の表示をフィルタ/ソートしたい</a></li><li><a href="#toc14" tabindex="0">シーン2: 日付の差分を表示したい (たとえば「xx日前」「xx時間前」)</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">パイプ (Pipe) とは何か？</span></h2>



<h3 class="wp-block-heading"><span id="toc2">パイプの目的・役割</span></h3>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li class="is-style-bottom-margin-2em has-bottom-margin"><strong><span class="marker-under">データ変換 (Formatting / Transforming)</span></strong><br>テンプレート (HTML) に表示する「直前」で、<a href="https://it-biz.online/web-design/ng-generate-component/">コンポーネント</a>から受け取った生データを、ユーザーが見やすい・使いやすい形に整形する。<br>例）日付の表示形式、数値の3桁区切り、文字列の大文字化など。</li>



<li><strong><span class="marker-under">テンプレートの可読性向上</span></strong><br>もしパイプがない場合、コンポーネントやテンプレート内にフォーマット用の複雑な処理が散らばるおそれがある。パイプを使うことで、
<ul class="wp-block-list">
<li>ビジネスロジック (コンポーネント) と表示用のフォーマット処理 (ビュー) を分離しやすい</li>



<li class="is-style-bottom-margin-2em has-bottom-margin">テンプレートは「必要な変換をパイプでつなぐ」だけになる<br>ため可読性が向上する。</li>
</ul>
</li>



<li><strong><span class="marker-under">Angular が提供するビルトイン機能との連携</span></strong><br>代表的なビルトインパイプ (<code>DatePipe</code>, <code>NumberPipe</code>, <code>CurrencyPipe</code>, <code>PercentPipe</code>, <code>UpperCasePipe</code> など) を利用することで、面倒なデータ変換の多くを少ないコードで実現できる。</li>
</ol>



<h3 class="wp-block-heading"><span id="toc3">パイプを使うには</span></h3>



<ul class="wp-block-list">
<li><strong>“|” (パイプ記号) を使う</strong><br>テンプレート内で <code>{{ 変数 | pipe名 }}</code> のように使います。複数のパイプをつなげて使うこともできます。</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!-- 例: 価格を3桁区切りにフォーマットし、通貨も付けて表示する -->
{{ price | number:'1.0-0' | currency:'JPY' }}
</pre>



<h2 class="wp-block-heading"><span id="toc4">初心者がつかむべき「イメージ」と簡単な利用シーン</span></h2>



<h3 class="wp-block-heading"><span id="toc5">単純なビルトインパイプの利用例</span></h3>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!-- コンポーネントのプロパティ -->
export class ExampleComponent {
  today = new Date();  // たとえば 2025-01-18
  price = 1234.5;
  userName = 'angular user';
}
</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!-- テンプレート -->
&lt;!-- ① 日付を表示 -->
&lt;p>Today: {{ today | date:'yyyy/MM/dd' }}&lt;/p>
&lt;!-- 出力例: Today: 2025/01/18 -->

&lt;!-- ② 価格を3桁区切りにして、通貨表記に -->
&lt;p>Price: {{ price | currency:'USD':'symbol':'1.0-2' }}&lt;/p>
&lt;!-- 出力例: Price: $1,234.50 -->

&lt;!-- ③ 文字列をすべて大文字に -->
&lt;p>User: {{ userName | uppercase }}&lt;/p>
&lt;!-- 出力例: User: ANGULAR USER -->
</pre>



<ul class="wp-block-list">
<li>このように、<code>{{ 変数 | pipe名:オプション }}</code> の形で、テンプレート上で値を変換するのがパイプの基本的な使い方です。</li>



<li><strong>利用シーン</strong>: ユーザーに見せたい情報があるとき、コンポーネント側のデータ構造や型はそのままで、最後の「表示」のタイミングだけパイプでスッキリ変換できる。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc6">複数パイプの連続利用</span></h3>



<p>1つの値に対して、パイプ記号 <code>|</code> を複数つなげることも可能です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!-- 価格を3桁区切り→JPY表記→大文字に -->
&lt;p>{{ price | number:'1.0-0' | currency:'JPY':'symbol' | uppercase }}&lt;/p>
</pre>



<ul class="wp-block-list">
<li><code>price</code> を整数表記にして (<code>number:'1.0-0'</code>)、</li>



<li><code>currency</code> で通貨（￥）を付与し (<code>currency:'JPY'</code>)、</li>



<li><code>uppercase</code> で最終的に大文字化したものが表示される。</li>
</ul>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>データ変換が段階的に行われるため、一連のフォーマット処理をテンプレート上で可視化しやすいのが利点の１つです。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc7">カスタムパイプの基本と概念</span></h2>



<p>Angularで用意されているビルドインパイプでは要件を満たさない場合、自分でパイプを作成することもできます。</p>



<p>例）日付 +「何日前」「何時間前」といった表示形式にしたい、配列を特定の条件でフィルタリングしたい、など。</p>



<h3 class="wp-block-heading"><span id="toc8">カスタムパイプの最小構成</span></h3>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// ex-rate.pipe.ts
import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'exRate' // テンプレート上で使うパイプ名
})
export class ExRatePipe implements PipeTransform {
  // transformメソッドが肝。引数は自由に定義できる（最初が「値」、それ以降がパラメータ）
  transform(value: number, rate: number): number {
    return value * rate;
  }
}
</pre>



<ol class="wp-block-list">
<li><code>@Pipe()</code> デコレーターで、パイプであることとパイプ名を宣言。</li>



<li><code>PipeTransform</code> インターフェースの <code>transform</code> メソッドを実装する（必須）。</li>



<li>変換したい処理を <code>transform</code> で書き、戻り値を返す。</li>
</ol>



<p><strong>テンプレートでの使用例</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!-- コンポーネントで amount = 100 として、1ドル=135円換算 で表示 -->
&lt;p>JPY: {{ amount | exRate:135 }}&lt;/p>
&lt;!-- 実行結果: 13500 -->
</pre>



<div class="wp-block-cocoon-blocks-tab-box-1 blank-box bb-tab bb-hint block-box">
<p>Angular のパイプ (Pipe) は <code>PipeTransform</code> インターフェースを実装しなければなりません。その必須メソッドが <code>transform</code> です。</p>



<ul class="wp-block-list">
<li><strong>役割</strong>: テンプレートから受け取った「変換元の値」と「パイプに与える引数 (オプション)」を受け取り、データ変換の結果を返却する。</li>



<li><strong>イメージ</strong>: 「生データ → <code>transform</code> → 表示用データ」の流れをになう変換ロジック本体。</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@Pipe({
  name: 'exRate'
})
export class ExRatePipe implements PipeTransform {
  transform(value: number, rate: number): number {
    return value * rate;
  }
}
</pre>



<p>上記の例では <code>transform(value, rate)</code> という形で「入力値とパラメータを受け取り、掛け算した結果」を返しています。テンプレートで <code>{{ amount | exRate:135 }}</code> と書くと、</p>



<ol class="wp-block-list">
<li><code>amount</code> が <code>value</code> に相当</li>



<li><code>135</code> が <code>rate</code> に相当</li>



<li><code>transform(100, 135)</code> → <code>13500</code> が戻り値<br>…という流れで表示に反映されます。</li>
</ol>
</div>



<h2 class="wp-block-heading"><span id="toc9">Change Detection (変更検知) との関係</span></h2>



<h3 class="wp-block-heading"><span id="toc10">(1) Angular における変更検知</span></h3>



<ul class="wp-block-list">
<li>Angular はコンポーネントのプロパティが変わったかどうかを監視 (Change Detection) し、変更があればテンプレートを再描画 (再評価) する仕組み。</li>



<li><strong>純粋パイプ (Pure Pipe)</strong> は「入力値 (およびその参照) が変わったときのみ」<code>transform</code> を再実行する。</li>



<li><strong>非純粋パイプ (Impure Pipe)</strong> は「変更検知サイクルごとに」<code>transform</code> を再実行する。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc11">(2) 純粋パイプと非純粋パイプ</span></h3>



<ol class="wp-block-list">
<li><strong>純粋パイプ (Pure Pipe)</strong>
<ul class="wp-block-list">
<li>デフォルトではこちら。<code>@Pipe({ name: 'xxx' })</code> と書くだけで純粋パイプとして扱われる。</li>



<li>値が変わったときだけ再評価されるので、パフォーマンスによい。</li>



<li>単純な日付変換や数値フォーマットなど、入力値が変わらないときに「結果も変わらない」処理に最適。</li>
</ul>
</li>



<li><strong>非純粋パイプ (Impure Pipe)</strong>
<ul class="wp-block-list">
<li><code>@Pipe({ name: 'xxx', pure: false })</code> のように、<code>pure: false</code> を指定すると非純粋パイプになる。</li>



<li>変更検知サイクルのたびに毎回 <code>transform</code> が走るので、配列やオブジェクトの“中身”の変化に対しても都度再評価される。</li>



<li><strong>利用シーン</strong>:
<ul class="wp-block-list">
<li>配列・オブジェクトをテンプレート上でフィルタやソートしたいときに、「単純に参照が新規になった/ならない」を超えて、内容の微細な変化に対応させたい場合など。</li>



<li>ただしパフォーマンスに影響するので、よく検討してから使う。</li>
</ul>
</li>
</ul>
</li>
</ol>



<p><strong>非純粋パイプの簡単な例</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@Pipe({
  name: 'search',
  pure: false // 非純粋パイプ
})
export class SearchPipe implements PipeTransform {
  transform(items: any[], keyword: string): any[] {
    return items.filter(item => item.name.includes(keyword));
  }
}
</pre>



<p>この例では、<code>items</code> (配列) や <code>keyword</code> (検索文字列) が細かく変化するたびにパイプを再評価し、フィルタ済みの配列を返す。もし純粋パイプだと、配列の「参照」が同じままでは再実行されないため、意図するタイミングで結果が更新されない場合がある。とはいえ「毎回呼ばれる」ことになるため、大きな配列・複雑な処理には注意が必要です。</p>



<h2 class="wp-block-heading"><span id="toc12">具体的な利用シーンとコード例</span></h2>



<h3 class="wp-block-heading"><span id="toc13">シーン1: ユーザー一覧の表示をフィルタ/ソートしたい</span></h3>



<ul class="wp-block-list">
<li>パイプでフィルタ処理を書けば、テンプレートに <code>| filterUser:'xxx'</code> のように書くだけで表示を切り替えられる。</li>



<li>ただし大量データがある場合は、都度全件フィルタするとパフォーマンスが落ちるため、コンポーネント側でフィルタした結果を保持するなど検討が必要。</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@Pipe({ 
  name: 'filterUser'
})
export class FilterUserPipe implements PipeTransform {
  transform(users: { id: number; name: string; }[], searchTerm: string): any[] {
    if (!searchTerm) return users;
    return users.filter(user => 
      user.name.toLowerCase().includes(searchTerm.toLowerCase())
    );
  }
}
</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!-- テンプレート -->
&lt;input [(ngModel)]="keyword" placeholder="検索ワード" />
&lt;ul>
  &lt;li *ngFor="let user of users | filterUser:keyword">
    {{ user.name }}
  &lt;/li>
&lt;/ul>
</pre>



<h3 class="wp-block-heading"><span id="toc14">シーン2: 日付の差分を表示したい (たとえば「xx日前」「xx時間前」)</span></h3>



<ul class="wp-block-list">
<li>ビルトインの <code>DatePipe</code> では「相対的な日付表示」はサポートしていない (locale, format によるもの) ので、カスタムパイプで実装する。</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@Pipe({
  name: 'relativeTime'
})
export class RelativeTimePipe implements PipeTransform {
  transform(value: Date): string {
    const now = new Date();
    const diffMs = now.getTime() - value.getTime();
    const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
    const diffHours = Math.floor(diffMs / (1000 * 60 * 60));

    if (diffDays > 0) {
      return `${diffDays}日前`;
    } else if (diffHours > 0) {
      return `${diffHours}時間前`;
    } else {
      return 'たった今';
    }
  }
}
</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!-- テンプレート例 -->
&lt;p>投稿時刻: {{ post.createdAt | relativeTime }}&lt;/p>
&lt;!-- 出力例: "1日前" "2時間前" ... -->
</pre>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<p class="has-text-align-center"><span class="badge-green">まとめ</span>　<strong>Angularのパイプ</strong>の理解</p>



<p><strong>パイプは「表示直前のデータ変換器」</strong></p>



<ul class="wp-block-list">
<li>テンプレートの可読性と表示処理の再利用性を高めるためにある。</li>



<li>ビルトインパイプでよく使うフォーマット (日付、数値、文字列など) は大半がカバーできる。</li>
</ul>



<p><strong>カスタムパイプで表示ロジックをカプセル化</strong></p>



<ul class="wp-block-list">
<li>変換ロジックを <code>transform</code> メソッドに閉じ込めることで、複数のテンプレートで同じフォーマットを簡単に使い回しできる。</li>



<li>「ビジネスロジックはコンポーネントやサービス側、表示ロジックはパイプ側」と分けるとシンプルに整理できる。</li>
</ul>



<p><strong>Change Detection と「純粋/非純粋」</strong></p>



<ul class="wp-block-list">
<li>純粋パイプは「入力が変わったときだけ」呼ばれるのでパフォーマンスに優れる。</li>



<li>非純粋パイプは「常に呼ばれる」ため、配列やオブジェクトの中身の変化を捉えたい場合に利用する。ただし多用は避ける。</li>
</ul>



<p><strong>利用シーンを明確に</strong></p>



<ul class="wp-block-list">
<li>大量データを都度フィルタしたり、複雑なロジックをパイプで実行するとパフォーマンスが落ちる。</li>



<li>あくまで「ちょっとした表示形式の変更・整形」を軽量に実装するのがパイプの本来の役割。</li>
</ul>
</div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p><strong>パイプは「コンポーネント → テンプレート」の単方向データフローの、テンプレート直前でのフォーマット処理</strong> としてとらえると理解しやすいです。</p>
</div></div>



<p>前提として「Angularの変更検知の流れ (コンポーネントのプロパティが変わるとテンプレートに反映される)」を押さえておけば、純粋パイプと非純粋パイプの振る舞いも自然と理解できるでしょう。一度使ってみるとその便利さを実感できるので、まずはビルトインパイプの日付フォーマットや数値フォーマットから試し、必要に応じてカスタムパイプでオリジナルの変換処理を実装してみてください。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TypeScript：メソッドとは？定義と呼び出し方法を１からわかりやすく解説</title>
		<link>https://it-biz.online/web-design/typescript-method/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Fri, 17 Jan 2025 12:35:05 +0000</pubDate>
				<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[WEBデザイン]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9579</guid>

					<description><![CDATA[このページでは、プログラミング初心者の方でも理解しやすいように、できるだけやさしい言葉を使って、TypeScriptにおける「メソッド」について詳しく解説します。 目次 【前提】そもそも「メソッド」とは？TypeScri [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>このページでは、プログラミング初心者の方でも理解しやすいように、できるだけやさしい言葉を使って、TypeScriptにおける「メソッド」について詳しく解説します。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>前提知識として、「プログラミング言語のクラス構文」というものがあることを少し聞いたことがある、ぐらいのイメージで読み進めていただければ大丈夫です。</p>
</div></div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-14" checked><label class="toc-title" for="toc-checkbox-14">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">【前提】そもそも「メソッド」とは？</a></li><li><a href="#toc2" tabindex="0">TypeScript：メソッド定義の基本構文</a><ol><li><a href="#toc3" tabindex="0">アクセス修飾子 (public, private, protected)</a></li></ol></li><li><a href="#toc4" tabindex="0">メソッドを呼び出すときのイメージ 〜インスタンス化とは？〜</a></li><li><a href="#toc5" tabindex="0">非同期処理を扱う「asyncメソッド」とは？</a></li><li><a href="#toc6" tabindex="0">実践的なサンプル：商品を管理するクラス</a><ol><li><a href="#toc7" tabindex="0">サンプルコードで注目すべきポイント</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">【前提】そもそも「メソッド」とは？</span></h2>



<p><strong>メソッド</strong>とは、あるクラス(オブジェクト)の中で定義される「<a href="https://it-biz.online/web-design/typescript-function/">関数</a>(処理のかたまり)」のことです。「関数」とほとんど同じ意味ですが、「クラスの中に入っている関数」を特別に「メソッド」と呼びます。</p>



<ul class="wp-block-list">
<li><strong>関数（function）</strong>: 単体の処理のかたまり</li>



<li><strong>メソッド（method）</strong>: クラスの一部として定義された関数</li>
</ul>



<p>もし「クラス」や「オブジェクト」という言葉がまだピンとこない場合は、「設計図」と「それをもとに作られる実体」とイメージしてみてください。クラスは「設計図」、そこから作られる実体を「インスタンス（オブジェクト）」と呼びます。詳しくはこちら（<span class="badge">参考</span> <a href="https://it-biz.online/web-design/typescript-calss/">TypeScriptのクラス</a>）</p>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="682" height="355" src="https://it-biz.online/wp-content/uploads/2023/06/image-22.png" alt="TypeScript クラスとは" class="wp-image-7813" style="width:682px;height:auto" srcset="https://it-biz.online/wp-content/uploads/2023/06/image-22.png 682w, https://it-biz.online/wp-content/uploads/2023/06/image-22-300x156.png 300w, https://it-biz.online/wp-content/uploads/2023/06/image-22-500x260.png 500w" sizes="(max-width: 682px) 100vw, 682px" /><figcaption class="wp-element-caption">図1：クラスとは？</figcaption></figure>



<h2 class="wp-block-heading"><span id="toc2">TypeScript：メソッド定義の基本構文</span></h2>



<p>TypeScriptでは、JavaScriptにクラス構文（class）が追加されており、そこに「メソッド」を定義できます。基本構文は以下のようになります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class MyClass {
  public myMethod(param: string): number {
    return param.length;
  }
}
</pre>



<p><strong>class MyClass</strong>:</p>



<ul class="wp-block-list is-style-icon-list-check-valid has-list-style">
<li><code>class</code> キーワードでクラスを定義し、<code>MyClass</code> という名前を付けています。</li>



<li>「<code>MyClass</code>という種類のオブジェクトが作れる設計図」を作っているイメージです。</li>
</ul>



<p><strong>public myMethod(param: string): number { ... }</strong>:</p>



<ul class="wp-block-list is-style-icon-list-check-valid has-list-style">
<li><code>myMethod</code> という名前の「メソッド」を定義しています。</li>



<li>丸かっこの中に <code>(param: string)</code> と書いてあり、<code>param</code> は「<code>string</code>型の引数(パラメータ)」ですよ、という型注釈が付いています。</li>



<li><strong><code>: number</code></strong> は「このメソッドは数値（number）を返します」という戻り値の型を示しています。</li>



<li><code>{ ... }</code> の中に処理を書きます。上の例では <code>return param.length;</code> として、文字列の長さ（<code>param.length</code>）を数値で返しています。</li>
</ul>



<div class="wp-block-cocoon-blocks-tab-box-1 blank-box bb-tab bb-check block-box">
<p>TypeScriptのメソッド定義は、<strong>基本的にはJavaScript（ES6以降）で導入されたクラス構文とほぼ同じ</strong>です。つまり、<strong>JavaScriptがもともと持っているクラス構文やメソッド定義の書き方がベース</strong>になっています。</p>



<p>ただし、TypeScriptには<strong><span class="marker-under">型注釈（パラメータの型や戻り値の型指定など）や、アクセス修飾子（public, private, protected）</span></strong> が追加されています。そういった部分が<strong>JavaScriptにはないTypeScript独自の要素</strong>だと考えるとわかりやすいです。</p>
</div>



<h3 class="wp-block-heading"><span id="toc3">アクセス修飾子 (public, private, protected)</span></h3>



<p><code>public</code> の部分は、「このメソッドはどこからでも呼び出せますよ」という意味の <strong>アクセス修飾子</strong> です。TypeScriptでは主に3種類あり、以下のようにクラスのプロパティ（変数）やメソッド（関数）に付けられます。</p>



<ol class="wp-block-list">
<li><strong>public</strong>: どこからでもアクセス（呼び出し）可能。</li>



<li><strong>private</strong>: 同じクラスの中だけからアクセス可能。（クラスの外からは呼べない）</li>



<li><strong>protected</strong>: 同じクラスと継承（サブクラス）したクラスの中だけからアクセス可能。</li>
</ol>



<p>初心者のうちは、まずは <code>public</code> でメソッドを定義しておけばOKです。</p>



<h2 class="wp-block-heading"><span id="toc4">メソッドを呼び出すときのイメージ 〜インスタンス化とは？〜</span></h2>



<p>クラスは「設計図」なので、そのままでは実際に使えません。クラスから「インスタンス」（実体）を作って、そのインスタンスを通じてメソッドを呼び出します。これを <strong>「インスタンス化」</strong> といいます。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="552" height="184" src="https://it-biz.online/wp-content/uploads/2024/03/image-6.png" alt="Typescript クラス" class="wp-image-8943" srcset="https://it-biz.online/wp-content/uploads/2024/03/image-6.png 552w, https://it-biz.online/wp-content/uploads/2024/03/image-6-500x167.png 500w, https://it-biz.online/wp-content/uploads/2024/03/image-6-300x100.png 300w" sizes="(max-width: 552px) 100vw, 552px" /><figcaption class="wp-element-caption">図2：クラスの概念</figcaption></figure>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// 1. クラスの定義
class Greeter {
  public greet(name: string): void {
    console.log(`Hello, ${name}!`);
  }
}

// 2. インスタンスを作成（インスタンス化）
const myGreeter = new Greeter();

// 3. メソッドを呼び出す
myGreeter.greet("Alice");  // 「Hello, Alice!」 と表示される
</pre>



<ul class="wp-block-list">
<li><code>new Greeter()</code> でクラス <code>Greeter</code> の実体（インスタンス）が生成され、<code>myGreeter</code> という変数に格納されます。</li>



<li><code>myGreeter.greet("Alice")</code> のように、<strong>「インスタンス.メソッド名(引数)」</strong> という書き方で、メソッドを呼び出します。</li>
</ul>



<h2 class="wp-block-heading"><span id="toc5">非同期処理を扱う「asyncメソッド」とは？</span></h2>



<p>TypeScript（JavaScript）では、<strong>「非同期処理」</strong> を扱うために <code>async/await</code> という機能があります。</p>



<p>たとえば、サーバーにデータを取りにいく処理などは時間がかかるため、プログラムがそれを待っているあいだ他のことを停止してしまわないように、いわゆる「非同期」の仕組みが使われます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class DataFetcher {
  public async fetchData(url: string): Promise&lt;any> {
    // `async` を付けることで、このメソッドはPromiseを返すようになる
    const response = await fetch(url); // fetch は非同期関数
    // `await` を使うと、その処理が終わるまで一旦待ってくれる
    return await response.json();
  }
}

// 使い方
(async () => {
  const fetcher = new DataFetcher();
  const data = await fetcher.fetchData("https://example.com/data.json");
  console.log(data);
})();
</pre>



<ul class="wp-block-list">
<li><strong><code>async</code></strong> は「このメソッドは非同期処理を行うよ」という宣言です。</li>



<li><strong><code>await</code></strong> は「Promiseを返す処理が終わるまで待ち合わせ」をするためのキーワードです。</li>



<li>これにより、見た目は「同期的（順番に処理が進んでいる）」なコードを書きながら、内部は非同期で動作させることができます。</li>
</ul>



<p>「<strong>Promise</strong>」というのは、ざっくり言うと「非同期の結果がいつか返ってくることを約束するオブジェクト」のようなものです。実際には「非同期処理が成功した場合は成功の結果、失敗した場合はエラーを返す」という仕組みになっていますが、初学者のうちは「長い時間かかる処理でも、その結果をひとまとめに扱える仕組み」と考える程度で大丈夫です。</p>



<h2 class="wp-block-heading"><span id="toc6">実践的なサンプル：商品を管理するクラス</span></h2>



<p>ここまでの知識を応用して、商品情報を扱うクラスを作る例を示します。たとえば、オンラインストアのシステムなどをイメージしてください。（<span class="badge">参考</span> <a href="https://it-biz.online/web-design/interface/">TypeScriptのインターフェースとは？</a>）</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// Productという「型（インターフェース）」を用意
interface Product {
  id: number;
  name: string;
  price: number;
}

class ProductService {
  // クラスの中で共通して使う配列を用意（ここではproductsという変数）
  private products: Product[] = [];

  // 商品を追加するメソッド
  public addProduct(product: Product): void {
    this.products.push(product);
  }

  // 商品一覧を返すメソッド
  public getAllProducts(): Product[] {
    return this.products;
  }

  // IDを指定して商品を取得するメソッド
  public getProductById(productId: number): Product | undefined {
    return this.products.find((p) => p.id === productId);
  }

  // 非同期で在庫チェックをするメソッド
  public async checkInventory(productId: number): Promise&lt;boolean> {
    // 擬似的な「サーバー問い合わせ」を再現するため、1秒待機している
    await new Promise((resolve) => setTimeout(resolve, 1000)); 
    // ランダムにtrue/falseを返す（50%の確率で在庫あり）
    return Math.random() > 0.5; 
  }
}

// === 実際に使ってみる ===
const productService = new ProductService();

// 商品を追加
productService.addProduct({ id: 1, name: "Book", price: 1000 });
productService.addProduct({ id: 2, name: "Pen", price: 100 });

// 追加された商品一覧を表示
console.log(productService.getAllProducts());

// IDが1の商品を取得してみる
const product = productService.getProductById(1);
console.log("ID=1の商品:", product);

// 在庫チェック（非同期メソッド）の呼び出し
(async () => {
  const hasInventory = await productService.checkInventory(1);
  console.log("ID=1に在庫があるか:", hasInventory);
})();
</pre>



<h3 class="wp-block-heading"><span id="toc7">サンプルコードで注目すべきポイント</span></h3>



<ol class="wp-block-list">
<li><strong><code>private products: Product[] = [];</code></strong>
<ul class="wp-block-list">
<li><code>private</code> 修飾子が付いた「クラス内の変数（プロパティ）」です。クラスの外からは直接アクセスできません。</li>



<li><code>products</code> は配列(<code>Product[]</code>)として初期化しています。</li>



<li>メソッドからは自由にアクセス・操作できますが、クラスの外から <code>productService.products</code> のように直接操作することはできません。</li>
</ul>
</li>



<li><strong>メソッドの設計</strong>
<ul class="wp-block-list">
<li><code>addProduct</code> : 商品を配列に追加する。</li>



<li><code>getAllProducts</code> : 登録されている商品を全部返す。</li>



<li><code>getProductById</code> : IDに一致する商品を返す。</li>



<li><code>checkInventory</code> : 在庫があるかを確認し、Promise（true or false）を返す非同期メソッド。</li>
</ul>
</li>



<li><strong>オブジェクト指向の考え方</strong>
<ul class="wp-block-list">
<li>データ（<code>products</code>）と、そのデータを扱うための処理（<code>addProduct</code>, <code>getProductById</code> など）が同じクラスにまとまっています。</li>



<li>これが「オブジェクト指向」という考え方の基本で、設計図（クラス）を元に作られたモノ（インスタンス）に対して、メソッドを使って操作をします。</li>
</ul>
</li>
</ol>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<p class="has-text-align-center"><span class="badge-green">まとめ</span>　<strong>TypeScriptのメソッド</strong></p>



<ol class="wp-block-list">
<li><strong>メソッド</strong>とは、クラスの中で定義された「関数」のことです。</li>



<li><strong>TypeScriptのクラス構文</strong>を使えば、メソッドの引数や戻り値に対して「型」をつけることができます。</li>



<li><strong>アクセス修飾子 (public, private, protected)</strong> により、メソッドやプロパティの公開範囲を制御できるので、安全で読みやすいコードを書きやすくなります。</li>



<li><strong>async/await</strong> を使うと、時間のかかる処理（たとえばサーバーからのデータ取得）を分かりやすいコードで書けます。</li>



<li>実際には、クラスのインスタンスを作って、そこからメソッドを呼び出すことで処理を行います。</li>
</ol>
</div>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">関数とメソッドはどう違うのですか？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p><strong>メソッド</strong>は、<strong>クラスやオブジェクトの一部として定義された関数</strong>のことです。<strong>関数(function)</strong> 自体は、クラスの外に定義するただの処理のかたまりです。</p>
</div></dd></dl></div>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">戻り値の型指定は必ず必要ですか？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>TypeScriptでは、明示的に指定したほうがよいですが、型推論が働く場合は書かなくても動作はします。ただし、初心者のうちはできるだけ明示するのをおすすめします。よりコードがわかりやすくなります。</p>
</div></dd></dl></div>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">asyncメソッドを使わずに非同期処理をするには？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>「Promiseを直接使う」や「コールバック関数を使う」など、いくつか方法があります。しかし、<code>async/await</code> はコードが読みやすいので、今から学ぶなら <code>async/await</code> を優先的に覚えるとよいでしょう。</p>
</div></dd></dl></div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TypeScript：クラスをわかりやすく説明【初心者向け】</title>
		<link>https://it-biz.online/web-design/typescript-calss/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Mon, 11 Mar 2024 02:32:11 +0000</pubDate>
				<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[WEBデザイン]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=8973</guid>

					<description><![CDATA[クラスとは、データとそれを操作する機能をひとまとめにした設計図のようなもの。特にTypeScriptのようなオブジェクト指向言語では、クラスはアプリケーションの基本的な構成要素として機能し、この設計図をもとに作成される実 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>クラスとは、<strong>データ</strong>と<strong>それを操作する機能</strong>をひとまとめにした設計図のようなもの。特にTypeScriptのようなオブジェクト指向言語では、クラスはアプリケーションの基本的な構成要素として機能し、この設計図をもとに作成される実体（＝オブジェクト）を通じてさまざまなデータや処理を管理し、複雑な機能を簡単に実装できるようになります。</p>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="682" height="355" src="https://it-biz.online/wp-content/uploads/2023/06/image-22.png" alt="TypeScript クラスとは" class="wp-image-7813" style="width:682px;height:auto" srcset="https://it-biz.online/wp-content/uploads/2023/06/image-22.png 682w, https://it-biz.online/wp-content/uploads/2023/06/image-22-300x156.png 300w, https://it-biz.online/wp-content/uploads/2023/06/image-22-500x260.png 500w" sizes="(max-width: 682px) 100vw, 682px" /><figcaption class="wp-element-caption">図1：クラスとは？</figcaption></figure>



<p>クラスを使用することでより安全で保守しやすいコードを書くことが可能になります。本記事では、TypeScriptにおけるクラスの基本的な定義方法から、より高度な利用方法まで、ステップバイステップで解説していきます。初心者の方でも理解しやすいように、基礎からしっかりと学べる内容となっていますので、是非最後までご一読ください。</p>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/web-design/typescript-abc/">TypeScriptとは？</a></p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p>クラスの概念や基本的な利用方法はJavaScriptとほぼ同様です。そもそも「クラスって何？」という方は、まずは以下のページをご覧いただくことを推奨します。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://it-biz.online/web-design/js-class/" title="Javascript：クラスとは何か？を３分で【初心者向け】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-biz.online/wp-content/uploads/2024/03/image-5-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-biz.online/wp-content/uploads/2024/03/image-5-320x180.png 320w, https://it-biz.online/wp-content/uploads/2024/03/image-5-240x135.png 240w, https://it-biz.online/wp-content/uploads/2024/03/image-5-640x360.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Javascript：クラスとは何か？を３分で【初心者向け】</div><div class="blogcard-snippet internal-blogcard-snippet">JavaScriptのクラスに関する基本的な概念、継承、カプセル化、ポリモーフィズム、静的メソッドとプロパティについて解説します。初心者から中級者向けに、クラスの使い方とオブジェクト指向プログラミングの鍵となる概念を学ぶことができます。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-biz.online" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-biz.online</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.01.17</div></div></div></div></a>
</div></figure>
</div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-16" checked><label class="toc-title" for="toc-checkbox-16">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">TypeScript：クラスとは</a><ol><li><a href="#toc2" tabindex="0">クラスの定義方法</a></li><li><a href="#toc3" tabindex="0">プロパティ</a></li><li><a href="#toc4" tabindex="0">メソッド</a></li><li><a href="#toc5" tabindex="0">アクセス修飾子</a></li><li><a href="#toc6" tabindex="0">ゲッターとセッター</a></li></ol></li><li><a href="#toc7" tabindex="0">継承</a></li><li><a href="#toc8" tabindex="0">ポリモーフィズム（多態性）</a><ol><li><a href="#toc9" tabindex="0">1. サブタイプポリモーフィズム（継承によるポリモーフィズム）</a></li><li><a href="#toc10" tabindex="0">2. アドホックポリモーフィズム</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">TypeScript：クラスとは</span></h2>



<p>クラスとは、オブジェクトの青写真（<strong><span class="marker-under">＝設計書</span></strong>）です。具体的にいうと、クラスは<strong>データ（属性）</strong>とそのデータに操作を加える<strong>メソッド</strong>（<a href="https://it-biz.online/web-design/typescript-function/">関数</a>）を１つのまとまりとして定義したものを指します。TypeScriptでは、このクラスを使用してデータ構造を定義し、その構造に沿ったオブジェクトを生成することができます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>クラスの基本的な構造には、以下のような要素が含まれます。</p>
</div></div>



<ol class="wp-block-list">
<li><strong>プロパティ（属性）</strong>
<ul class="wp-block-list">
<li>クラスに属するデータの<a href="https://it-biz.online/web-design/variavle-type/">変数</a>。オブジェクトの状態を表します。</li>
</ul>
</li>



<li><strong>メソッド</strong>
<ul class="wp-block-list">
<li>クラスに属する関数。オブジェクトの振る舞いを定義。プロパティの値を操作したり、何らかの処理を行うために使用されます。</li>
</ul>
</li>



<li><strong>コンストラクタ</strong>
<ul class="wp-block-list">
<li>クラスから<strong>オブジェクトを生成する際に自動的に呼び出される特殊なメソッド</strong>。オブジェクトの初期化に用いられます。</li>
</ul>
</li>
</ol>



<p>TypeScriptでは、これらのクラス要素を利用することで、コードの再利用性を高め、複雑なアプリケーションでも管理しやすい構造を作ることを可能にします。</p>



<p>例えば、車を表すクラスを作成する場合、<strong>プロパティ</strong>として「色」「車種」を、<strong>メソッド</strong>として「加速する」「停止する」を定義。このように定義することで、同じ構造を持つ複数の車オブジェクトを簡単に作成し、それぞれに異なる属性を持たせることができます。</p>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="682" height="355" src="https://it-biz.online/wp-content/uploads/2023/06/image-22.png" alt="TypeScript クラスとは" class="wp-image-7813" style="width:682px;height:auto" srcset="https://it-biz.online/wp-content/uploads/2023/06/image-22.png 682w, https://it-biz.online/wp-content/uploads/2023/06/image-22-300x156.png 300w, https://it-biz.online/wp-content/uploads/2023/06/image-22-500x260.png 500w" sizes="(max-width: 682px) 100vw, 682px" /><figcaption class="wp-element-caption">（再掲）図1：クラスとは？</figcaption></figure>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Car {
  // プロパティの定義
  color: string;
  model: string;

  // コンストラクタの定義
  constructor(color: string, model: string) {
    this.color = color;
    this.model = model;
  }

  // メソッドの定義
  accelerate() {
    console.log(`${this.model} is accelerating.`);
  }

  stop() {
    console.log(`${this.model} has stopped.`);
  }
}

// Carクラスのオブジェクトを生成
const myCar = new Car('red', 'Toyota');
myCar.accelerate(); // 出力: Toyota is accelerating.
myCar.stop();       // 出力: Toyota has stopped.</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>クラスの定義方法はJavascriptとほとんど同じ。「型」を指定する必要があるという点を除けば、その概念も役割もほとんど同じです。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc2">クラスの定義方法</span></h3>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Person {
  // プロパティの定義
  name: string;
  age: number;

  // コンストラクタの定義
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  // メソッドの定義
  describe() {
    console.log(`${this.name} is ${this.age} years old.`);
  }
}

// Personクラスのインスタンスを作成
const person1 = new Person('Alice', 30);
person1.describe(); // 出力: Alice is 30 years old.</pre>



<ol class="wp-block-list">
<li><strong>クラスキーワードの使用</strong>
<ul class="wp-block-list">
<li><span class="bold-blue"><code>class</code> キーワード</span>を利用</li>
</ul>
</li>



<li><strong>クラス名の指定</strong>
<ul class="wp-block-list">
<li>クラスを識別するための名前が必要。名前は大文字で始めることが一般的。</li>
</ul>
</li>



<li><strong>プロパティの定義</strong>
<ul class="wp-block-list">
<li>クラス内で使用されるデータ（プロパティ）を定義。これらはクラスのインスタンス毎に異なる値を持つことができます。</li>
</ul>
</li>



<li><strong>コンストラクタの定義</strong>
<ul class="wp-block-list">
<li>必要に応じて、<code><span class="bold-blue">constructor</span></code> メソッドを定義して、クラスのインスタンスが作成された際の初期化処理を記述。</li>
</ul>
</li>



<li><strong>メソッドの追加</strong>
<ul class="wp-block-list">
<li>クラスが行うべき操作をメソッドとして追加。プロパティの値を変更するメソッドや、何らかの処理を実行するメソッドが含まれます。</li>
</ul>
</li>
</ol>



<p>↑の例では、<code>Person</code>という名前のクラスを定義し、<code>name</code>と<code>age</code>という２つのプロパティ、および<code>describe</code>というメソッドを持っています。<code>new Person('Alice', 30)</code>を使って<code>Person</code>クラスのインスタンスを生成し、そのインスタンスに対して<code>describe</code>メソッドを呼び出しています。</p>



<h3 class="wp-block-heading"><span id="toc3">プロパティ</span></h3>



<p>プロパティは、そのクラスのインスタンスに関連付けられたデータ（＝<a href="https://it-biz.online/web-design/variavle-type/">変数</a>）です。プロパティは通常クラスの先頭部分で定義されます。TypeScriptでは、プロパティの型を明示的に宣言することで、型安全性とコードの読みやすさを向上させます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Vehicle {
  color: string;
  constructor(color: string) {
    this.color = color; // プロパティの初期化
  }
}</pre>



<h3 class="wp-block-heading"><span id="toc4">メソッド</span></h3>



<p>メソッドはクラスに属する<a href="https://it-biz.online/web-design/typescript-function/">関数</a>であり、クラスのインスタンスが行う操作を定義します。メソッド内で<code><span class="bold-blue">this</span></code>キーワードを使用することで、同じクラスの他のメソッドやプロパティにアクセスできます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Vehicle {
  color: string;
  constructor(color: string) {
    this.color = color;
  }
  describe() {
    console.log(`This vehicle is ${this.color}.`);
  }
}</pre>



<h3 class="wp-block-heading"><span id="toc5">アクセス修飾子</span></h3>



<p>TypeScriptでは、プロパテやメソッドに対して<strong><span class="marker-under">アクセス修飾子</span></strong>を使用することができます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>アクセス修飾子とは、簡単に言えばそのプロパティ/メソッドが、<strong>プログラムの他の部分から参照できるのか？参照できないのか？を表す</strong>もの。</p>
</div></div>



<p>アクセス修飾子には<code><span class="bold-blue">public</span></code>、<code><span class="bold-blue">private</span></code>、<code><span class="bold-blue">protected</span></code>の3種類があり、それぞれがメンバーの可視性とアクセス範囲を定義します。</p>



<ul class="wp-block-list">
<li><strong>public</strong>: どこからでもアクセス可能。デフォルトは<code>public</code>として扱われる。</li>



<li><strong>private</strong>: メンバーが定義されたクラス内からのみアクセス可能。クラスの外部からはアクセスできない。</li>



<li><strong>protected</strong>: <code>private</code>と似ていますが、派生クラスからのアクセスも許可される。</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Vehicle {
  private color: string;

  constructor(color: string) {
    this.color = color;
  }

  public describe() {
    console.log(`This vehicle is ${this.color}.`);
  }
}</pre>



<p>上記の「color」は<code>private</code>であるため、<strong><span class="marker-under">外部から「Vehicle.color」のような形で参照することができません</span></strong>。クラス内でのみ利用可能だよ！ということを示しています。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>アクセス修飾子を使用することで、クラスの使用方法を制限し、予期しない方法での利用を防止することが可能になります。また、クラスの設計者が意図した安全なインターフェースを提供することができます。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc6">ゲッターとセッター</span></h3>



<p>TypeScriptでは、プロパティの値へのアクセスを制御するために、ゲッター（<strong>getter</strong>）とセッター（<strong>setter</strong>）を定義することができます。これらはそれぞれ、プロパティの値を取得または設定するメソッドとして機能します。ゲッターとセッターを使用することで、プロパティへのアクセスをより詳細に制御し、外部からの不適切な値の設定を防ぐことが可能になります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Vehicle {
  private _color: string;

  constructor(color: string) {
    this._color = color;
  }

  get color() {
    return this._color;
  }

  set color(value: string) {
    if(value === '') throw new Error("Color cannot be empty.");
    this._color = value;
  }
}

const vehicle = new Vehicle("red");
console.log(vehicle.color); // "red"
vehicle.color = "blue";     // セッターを通じて値を設定
console.log(vehicle.color); // "blue"</pre>



<p>本来、プロパティ<code>_color</code>は<code><span class="bold-blue">private</span></code>で宣言されており、クラスの外部から直接アクセスすることはできません。ですが代わりに、ゲッターとセッターを通じて、間接的にこのプロパティの値を取得または設定しています。このテクニックを用いることで、値の検証や処理をゲッター/セッター内で実施することができ、より安全なプログラミングが可能になります。</p>



<h2 class="wp-block-heading"><span id="toc7">継承</span></h2>



<p>継承は、オブジェクト指向プログラミングの中心的な概念の１つ。クラス間でコードを再利用するためのメカニズムです。継承を使用することで、既存のクラス（親クラス、またはスーパークラスとも呼ばれる）のプロパティやメソッドを<strong><span class="marker-under">新しいクラス（子クラス、またはサブクラスとも呼ばれる）が受け継ぎ</span></strong>、それらを使用、拡張、または変更することができます。このプロセスにより、コードの重複を減らし、プログラムの構造をより管理しやすく、拡張しやすいものにすることができます。</p>



<p>TypeScriptでは、<code><span class="bold-blue">extends</span></code>キーワードを使用して継承を実装します。サブクラスはスーパークラスのすべての公開（public）メンバーと保護（protected）メンバーを継承しますが、プライベート（private）メンバーは継承されません。サブクラスは継承したメンバーに加えて、独自のメンバーを持つことができます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>例として、<code>Animal</code>クラスを親クラスとし、このクラスから<code>Dog</code>クラスと<code>Cat</code>クラスを派生させることを考えてみましょう。</p>
</div></div>



<p><code>Animal</code>クラスには、すべての動物に共通のプロパティやメソッドが定義されているとします。<code>Dog</code>クラスと<code>Cat</code>クラスでは、これらを継承しつつ、種に特有の振る舞いを追加することができます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Animal {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
  makeSound() {
    console.log('Some generic animal sound');
  }
}

class Dog extends Animal {
  constructor(name: string) {
    super(name); // 親クラスのコンストラクタを呼び出す
  }
  makeSound() {
    console.log('Woof');
  }
}

class Cat extends Animal {
  constructor(name: string) {
    super(name);
  }
  makeSound() {
    console.log('Meow');
  }
}</pre>



<p>この例では、<code>Dog</code>と<code>Cat</code>の両クラスが<code>Animal</code>クラスから<code>name</code>プロパティと<code>makeSound</code>メソッドを継承していますが、それぞれの<code>makeSound</code>メソッドをオーバーライドして独自の音を出すようにしています。これにより、同じメソッドを呼び出しても、オブジェクトの型に応じて異なる結果が得られるようになります。これが継承の実例です。</p>



<p class="has-text-align-center"><span class="badge-green">ポイント</span>　<strong>継承の主な利点</strong></p>



<ol class="wp-block-list">
<li><strong>コードの再利用</strong>
<ul class="wp-block-list">
<li>既存のクラスの機能を基にして新しいクラスを作成することで、コードを効率的に再利用することができる。</li>
</ul>
</li>



<li><strong>拡張性</strong>
<ul class="wp-block-list">
<li>既存のクラスに新しい機能を追加したり、既存の機能をカスタマイズすることが簡単になる。</li>
</ul>
</li>



<li><strong>階層的なクラス構造</strong>
<ul class="wp-block-list">
<li>クラス間の関係を階層的に構築することができ、より組織的で理解しやすいコードベースを作成することが可能になる。この階層構造により、共通の機能は上位のクラスに、特有の機能は下位のクラスに配置することで、クラスの専門化を進めることができる。</li>
</ul>
</li>



<li><strong>多様性の実現</strong>
<ul class="wp-block-list">
<li>サブクラスはスーパークラスのメソッドをオーバーライド（上書き）することができ、同一のインターフェースを持ちながら異なる振る舞いを実装することが可能になります。これにより、同じ種類のオブジェクトでも異なる動作をさせることができるため、柔軟な設計が実現されます。</li>
</ul>
</li>
</ol>



<h2 class="wp-block-heading"><span id="toc8">ポリモーフィズム（多態性）</span></h2>



<p><strong>ポリモーフィズム</strong>は、オブジェクト指向プログラミングにおける重要な概念の１つ。「多態性」または「多形性」とも呼ばれます。</p>



<p>ポリモーフィズムを利用することで、異なるクラスのオブジェクトが同じインターフェースやメソッドを通じて操作されることを可能にし、コードの柔軟性と再利用性を高めることができます。ポリモーフィズムには主に２つの形式があります：<strong><span class="marker-under">サブタイプポリモーフィズム</span></strong>（継承によるポリモーフィズム）と<span class="marker-under">アドホックポリモーフィズム</span>（オーバーロードやジェネリクスによるポリモーフィズム）</p>



<h3 class="wp-block-heading"><span id="toc9">1. サブタイプポリモーフィズム（継承によるポリモーフィズム）</span></h3>



<p>サブタイプポリモーフィズムは、クラスの継承を利用して実現されます。基底クラス（またはインターフェース）の参照を通じて、派生クラスのオブジェクトを操作することができます。これにより、異なるサブクラスのオブジェクトを同一の方法で扱うことが可能になります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// スーパークラス：Animal
class Animal {
    name: string;

    constructor(name: string) {
        this.name = name;
    }

    // 共通の行動をメソッドで定義
    makeSound() {
        console.log("Some generic sound");
    }
}

// サブクラス：Dog
class Dog extends Animal {
    // Dogクラス固有のメソッド
    wagTail() {
        console.log("Wagging tail");
    }

    // スーパークラスのメソッドをオーバーライド（上書き）
    makeSound() {
        console.log("Woof!");
    }
}

// サブクラス：Cat
class Cat extends Animal {
    // Catクラス固有のメソッド
    chaseMouse() {
        console.log("Chasing a mouse");
    }

    // スーパークラスのメソッドをオーバーライド（上書き）
    makeSound() {
        console.log("Meow");
    }
}

// Animal型の配列に、DogとCatのインスタンスを追加
const animals: Animal[] = [new Dog("Rex"), new Cat("Whiskers")];

// 各動物のmakeSoundメソッドを呼び出す
animals.forEach(animal => animal.makeSound());</pre>



<p>この例では、<code>Animal</code>クラスが基底クラス（スーパークラス）として定義され、<code>Dog</code>と<code>Cat</code>がそれを継承しています（サブクラス）。<code>Dog</code>と<code>Cat</code>は、<code>Animal</code>の<code>makeSound</code>メソッドをそれぞれの鳴き声に合わせてオーバーライドしています。さらに、それぞれのクラスには、固有の行動を表すメソッド（<code>wagTail</code>、<code>chaseMouse</code>）が追加されています。</p>



<p>このコードのポイントは、異なる種類のオブジェクト（<code>Dog</code>、<code>Cat</code>）を、共通のスーパークラス型（<code>Animal</code>）の配列に格納し、共通のインターフェース（<code>makeSound</code>メソッド）を介して、それぞれ異なる具体的な振る舞いを実行させることができる点です。これにより、コードの柔軟性と再利用性が高まります。</p>



<h3 class="wp-block-heading"><span id="toc10">2. アドホックポリモーフィズム</span></h3>



<p>アドホックポリモーフィズムは、<strong>関数のオーバーロード</strong>や<strong>ジェネリクス</strong>を通じて実現されます。これにより、同じ関数名でも異なる型の引数に対応したり、同一のインターフェースを持つが内部的に異なる挙動をする関数を定義することができます。</p>



<h4 class="wp-block-heading">関数のオーバーロード（関数オーバーロード）</h4>



<p>TypeScriptでは、同じ関数名でも異なる引数の型や数に応じて異なる実装を提供することができます。ただし、TypeScriptでは直接的なオーバーロードの実装はサポートされていないため、シグネチャをオーバーロードする形で実現します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">function greet(name: string): string;
function greet(age: number): string;
function greet(value: string | number): string {
    if (typeof value === 'string') {
        return `Hello, ${value}`;
    } else {
        return `You are ${value} years old`;
    }
}

console.log(greet("Alice")); // Hello, Alice
console.log(greet(25)); // You are 25 years old</pre>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/web-design/typescript-function/">TypeScript：関数</a></p>



<h4 class="wp-block-heading">ジェネリクス（ジェネリックプログラミング）</h4>



<p>ジェネリクスを使用すると、型をパラメータとして関数やクラスに渡すことができ、コードの再利用性を高めることが可能になります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">function identity&lt;T>(arg: T): T {
    return arg;
}

let output1 = identity&lt;string>("myString");
let output2 = identity&lt;number>(100);

console.log(output1); // myString
console.log(output2); // 100</pre>



<p><code>identity</code>関数はどのような型の引数も受け取り、同じ型の値を返します。ジェネリクスを用いることで、関数の呼び出し時に型を指定し、様々な型に対して柔軟に対応することができます。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<p class="has-text-align-center"><span class="badge-green">まとめ</span>　<strong>TypeScriptのクラス</strong></p>



<ol class="wp-block-list">
<li><strong>クラス定義</strong>: <code>class</code> キーワードを使用して定義。</li>



<li><strong>コンストラクタ</strong>: クラスからオブジェクトを生成する際に自動的に実行される特別なメソッド。</li>



<li><strong>プロパティ</strong>: クラス内で定義される変数。オブジェクトの状態を表す。</li>



<li><strong>メソッド</strong>: オブジェクトの行動を定義する関数。</li>



<li><strong>アクセス修飾子</strong>: <code>public</code>、<code>private</code>、<code>protected</code> など、メンバーの可視性を制御。</li>



<li><strong>継承</strong>: <code>extends</code> キーワードを使用して、既存のクラスを基に新しいクラスを作成。</li>
</ol>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">abstract class Animal {
    constructor(public name: string) {}

    abstract makeSound(): void; // 抽象メソッド
}

class Dog extends Animal {
    constructor(name: string, public owner: string) {
        super(name); // 親クラスのコンストラクタを呼び出す
    }

    makeSound(): void {
        console.log(`${this.name} says Woof!`);
    }
}

interface Pet {
    play(): void;
}

class Cat extends Animal implements Pet {
    constructor(name: string) {
        super(name);
    }

    makeSound(): void {
        console.log(`${this.name} says Meow!`);
    }

    play(): void {
        console.log(`${this.name} is playing with a ball.`);
    }
}

const myDog = new Dog("Buddy", "John");
myDog.makeSound(); // Buddy says Woof!

const myCat = new Cat("Whiskers");
myCat.makeSound(); // Whiskers says Meow!
myCat.play(); // Whiskers is playing with a ball.</pre>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Angular：ディレクティブとは何か？初心者向けにわかりやすく３分で解説</title>
		<link>https://it-biz.online/web-design/angular-directive/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Fri, 17 Jan 2025 10:19:46 +0000</pubDate>
				<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[WEBデザイン]]></category>
		<category><![CDATA[Angular]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9549</guid>

					<description><![CDATA[Angularでよく耳にする「ディレクティブ」という概念は、一言でいうと「HTML要素に特別な振る舞いや制御を付与するための拡張機能」です。 このページでは、そもそもディレクティブって何？という人向けにディレクティブのイ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Angularでよく耳にする「ディレクティブ」という概念は、一言でいうと「<strong><span class="marker-under">HTML要素に特別な振る舞いや制御を付与するための拡張機能</span></strong>」です。</p>



<p>このページでは、そもそもディレクティブって何？という人向けにディレクティブのイメージ・本質的な理解が進むように１からわかりやすく使い方や注意点を解説していきます。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-18" checked><label class="toc-title" for="toc-checkbox-18">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">まずはディレクティブのイメージをつかむ</a><ol><li><a href="#toc2" tabindex="0">「HTMLに命令を埋め込む」という発想</a></li><li><a href="#toc3" tabindex="0">コンポーネントとの違いをざっくり知る</a></li><li><a href="#toc4" tabindex="0">ディレクティブがもたらすメリット</a></li></ol></li><li><a href="#toc5" tabindex="0">ディレクティブの種類</a><ol><li><a href="#toc6" tabindex="0">1. コンポーネント（Component Directive）</a></li><li><a href="#toc7" tabindex="0">2. 構造ディレクティブ（Structural Directive）</a></li><li><a href="#toc8" tabindex="0">3. 属性ディレクティブ（Attribute Directive）</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">まずはディレクティブのイメージをつかむ</span></h2>



<p>たとえば、普通のHTMLでは<code>&lt;div></code>や<code>&lt;p></code>などの要素をただ書いただけでは、そこに特別な「動き」はありません。テキストを表示したり、見出しを表現したりするだけです。</p>



<p>そこに「<strong>この要素は、ある条件が満たされたら表示し、そうでなければ非表示にしたい</strong>」とか、「<strong>ある配列のデータをもとに、同じ形の要素を繰り返し表示したい</strong>」といった動的な振る舞いを付けたくなる場面が出てきます。</p>



<p>Angularにおいては、この「動的な振る舞い」をHTML要素に追加するための仕組みこそがディレクティブです。ディレクティブを使うと、HTMLタグをただ書くだけでなく、「<strong>この要素はどう表示されるのか</strong>」「<strong>いつレンダリングされるのか</strong>」といった命令を付け加えることができます。</p>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box not-nested-style cocoon-block-tab-caption-box"><div class="tab-caption-box-label block-box-label box-label fab-lightbulb"><span class="tab-caption-box-label-text block-box-label-text box-label-text">JavaScriptでのDOM操作との違い</span></div><div class="tab-caption-box-content block-box-content box-content">
<p>従来のJavaScriptでDOM（<span class="badge">参考</span> <a href="https://it-biz.online/web-design/dom/">DOMとは？</a>）を直接操作する場合には、以下のようなステップが必要でした。</p>



<ol class="wp-block-list">
<li>JavaScriptで<code>document.getElementById()</code>などを使い、特定の要素を取得する。</li>



<li>その要素の<code>style.display</code>を操作して表示／非表示を切り替えたり、クラスを付けたり、テキストを変更したりする。</li>



<li>条件が変わるたびに、この要素のDOM操作をもう一度書く。</li>
</ol>



<p>こうした処理を複数のHTML要素に対して行うと、コード量が増えメンテナンスが煩雑になります。さらに、<strong>「UI側(HTML)の定義」と「JavaScript側(ロジック)の処理」が分散</strong>してしまうため、「どこで何をやっているのか」がわかりにくくなる、という課題が出てきます。</p>



<p>一方で、Angularのディレクティブを使うと、HTMLのテンプレートに「表示するときはこうする」という命令（ディレクティブ）を組み込めるので、UIとロジックの関連が見えやすく、構造を把握しやすいという利点があります。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc2">「HTMLに命令を埋め込む」という発想</span></h3>



<p>ディレクティブは<strong>HTML側に命令を埋め込む</strong>ようなイメージで考えると理解しやすくなります。「ここにもしデータがあったら繰り返し表示する」「ここの条件がtrueなら、このブロックを描画する」といった振る舞いを、HTMLタグの属性として書けるのです。</p>



<ul class="wp-block-list">
<li>例: <code><span class="blue">*ngIf="isVisible"</span></code>
<ul class="wp-block-list">
<li><code>isVisible</code>という変数が<code>true</code>のときだけ要素が表示される</li>
</ul>
</li>



<li>例:<span class="bold-red"> </span><code><span class="blue">*ngFor="let item of items"</span></code>
<ul class="wp-block-list">
<li><code>items</code>配列をひとつずつ取り出して要素を繰り返し生成する</li>
</ul>
</li>
</ul>



<p>こうしたディレクティブをHTMLに貼り付けるだけで、Angularはテンプレートを解釈し、内部的にDOMを追加／削除したり、表示／非表示の切り替えを行ってくれます。</p>



<h3 class="wp-block-heading"><span id="toc3">コンポーネントとの違いをざっくり知る</span></h3>



<p>Angularを学び始めると、ディレクティブとほぼ同時に「<a href="https://it-biz.online/web-design/ng-generate-component/">コンポーネント</a>」という言葉を耳にするはずです。コンポーネントも広い意味では「ディレクティブの一種」とされますが、次のような違いがあります。</p>



<ul class="wp-block-list">
<li><strong>コンポーネント</strong>
<ul class="wp-block-list">
<li>HTMLテンプレート、TypeScriptのクラス、CSSスタイルなどをひとまとめにした「画面の部品」</li>



<li><code>&lt;app-○○></code>のような独自タグとして使うことが多い</li>
</ul>
</li>



<li><strong>ディレクティブ（構造・属性ディレクティブなど）</strong>
<ul class="wp-block-list">
<li>画面の見た目そのものではなく、既存のHTML要素の振る舞いだけを拡張する命令書のようなイメージ</li>



<li><code><span class="blue">*ngIf</span></code>や<code><span class="blue">*ngFor</span></code>のような構造ディレクティブ、<code><span class="blue">[ngClass]</span></code>のような属性ディレクティブが代表例</li>
</ul>
</li>
</ul>



<p>このようにコンポーネントとディレクティブは、どちらも「AngularがHTMLをどう解釈して動的に扱うか」を制御していますが、コンポーネントは「<strong>見た目のかたまり</strong>」を構成するのに対し、ディレクティブは「<strong>特定の振る舞いを要素に追加する</strong>」という役割に特化しているというイメージを持つと、両者を使い分けやすくなります。</p>



<h3 class="wp-block-heading"><span id="toc4">ディレクティブがもたらすメリット</span></h3>



<ol class="wp-block-list">
<li><strong>HTMLテンプレートに直接“動き”を宣言できる</strong>
<ul class="wp-block-list">
<li><code>*ngIf</code>や<code>*ngFor</code>を見れば、一目で「ここの要素が条件付き表示／繰り返し表示なんだ」と理解できる。</li>
</ul>
</li>



<li><strong>コードの可読性・メンテナンス性の向上</strong>
<ul class="wp-block-list">
<li>画面遷移や表示切り替えといったロジックを、HTML側と直接リンクさせて書けるため、可読性が上がる。</li>
</ul>
</li>



<li><strong>複雑なDOM操作の削減</strong>
<ul class="wp-block-list">
<li>もしディレクティブがなければ、JavaScriptでDOM操作のAPIを使って要素の追加削除を毎回行う必要があるが、その分の処理をAngular側が肩代わりしてくれる。</li>
</ul>
</li>
</ol>



<p>こうしたメリットから、Angularのディレクティブは<strong>アプリケーションのUIをより動的かつ宣言的に構築できる</strong>重要な機能だと言えます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>このようにディレクティブの本質は「<strong>HTML要素をベースに、より複雑な処理を記述できる拡張機能</strong>」として存在していることにあります。単純なHTMLの延長線として考えられるので、初心者の方でも慣れてくると「ここで<code>*ngIf</code>を使えばいいのか」「繰り返し表示には<code>*ngFor</code>を使うんだな」と自然に使いこなせるようになるでしょう。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc5">ディレクティブの種類</span></h2>



<p>Angularでは、多彩な動きをHTML要素に追加できるディレクティブですが、大きく分けて3つのカテゴリーに分類されます。ここでは、それぞれの特徴や使い方をイメージしやすいように、順を追って解説していきます。</p>



<h3 class="wp-block-heading"><span id="toc6">1. コンポーネント（Component Directive）</span></h3>



<ul class="wp-block-list is-style-icon-list-check-valid has-list-style">
<li><strong>何をする？</strong>
<ul class="wp-block-list">
<li>画面（UI）を構成する最小単位の部品を定義するためのディレクティブです。</li>



<li>独自のHTMLテンプレート、CSSスタイル、そして振る舞い（TypeScriptクラス）をまとめて管理します。</li>
</ul>
</li>



<li><strong>どんなイメージ？</strong>
<ul class="wp-block-list">
<li>「ボタン」「カード」「ユーザー情報パネル」のように、ひとかたまりのUI要素として切り出したいときに使います。</li>



<li><code>&lt;app-xxx></code> のような独自タグが作られて、テンプレート内で再利用できるようになります。</li>
</ul>
</li>



<li><strong>なぜ便利？</strong>
<ul class="wp-block-list">
<li>テンプレートやロジックが分離されずに一体化して管理できるため、開発・保守がしやすい。</li>



<li>コードの再利用やチーム開発時の分担がやりやすくなる。</li>
</ul>
</li>
</ul>



<h4 class="wp-block-heading">コンポーネントはディレクティブの一種</h4>



<p>技術的には、コンポーネント（<code>@Component</code>）もディレクティブ（<code>@Directive</code>）の拡張版として位置付けられています。ただし、コンポーネントが「UIのひとかたまり」であるのに対して、構造・属性ディレクティブは「UIの見た目や構造を変化させるための命令書」という位置づけです。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>コンポーネントについては別切りで解説ページを作っておりますので以下で詳しく確認してください。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://it-biz.online/web-design/ng-generate-component/" title="Angular：コンポーネントの基本：作成方法を３分で解説" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-biz.online/wp-content/uploads/2024/03/image-17-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-biz.online/wp-content/uploads/2024/03/image-17-320x180.png 320w, https://it-biz.online/wp-content/uploads/2024/03/image-17-240x135.png 240w, https://it-biz.online/wp-content/uploads/2024/03/image-17-640x360.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Angular：コンポーネントの基本：作成方法を３分で解説</div><div class="blogcard-snippet internal-blogcard-snippet">Angularのコンポーネントとは何か、そして簡単なステップで自分のAngularコンポーネントを作成する方法を学びましょう。このガイドでは、コンポーネントの基本概念から、Angular CLIを利用した効率的なコンポーネントの生成、テンプレートとスタイルのカスタマイズ方法までをわかりやすく解説します。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-biz.online" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-biz.online</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.01.10</div></div></div></div></a>
</div></figure>
</div></div>



<h3 class="wp-block-heading"><span id="toc7">2. 構造ディレクティブ（Structural Directive）</span></h3>



<ul class="wp-block-list">
<li><strong>何をする？</strong>
<ul class="wp-block-list">
<li>HTMLの要素を「追加・削除」して、<strong>DOM（画面構造）自体を変化させる</strong>ためのディレクティブです。</li>
</ul>
</li>



<li><strong>どんなイメージ？</strong>
<ul class="wp-block-list">
<li>「条件がtrueのときだけ要素を表示したい」「配列の要素を繰り返し表示したい」など、動的に要素を増減する仕組みが必要なときに使います。</li>
</ul>
</li>



<li><strong>なぜ便利？</strong>
<ul class="wp-block-list">
<li>従来ならJavaScriptでDOM操作をして要素を手動で増やしたり削除したりしていた部分を、テンプレートの記述だけで表現できる。</li>



<li>画面ロジックがHTML上で明確にわかるので、可読性も高い。</li>
</ul>
</li>
</ul>



<p><span class="badge-blue">サンプルコード1</span>　<code><strong>*ngIf</strong></code>と*<code><strong>ngFor</strong></code> の併用</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;div *ngIf="items &amp;&amp; items.length > 0">
  &lt;ul>
    &lt;li *ngFor="let item of items">{{ item }}&lt;/li>
  &lt;/ul>
&lt;/div></pre>



<p>要素が存在して、かつ1つ以上アイテムがある場合にのみ、リストを表示する構造を簡潔に表現できます。構造ディレクティブは、<strong><span class="marker-under"><code>*</code>プレフィックス</span></strong>を使用してテンプレート上で適用されます。これにより、Angularはディレクティブの存在する要素をラップする<code>&lt;ng-template></code>を自動的に作成し、その内容の表示を制御することができます。</p>



<p><span class="badge-blue">サンプルコード2</span>　<code><strong>*ngIf</strong></code>を使用して条件に応じて要素を表示/非表示にする</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!-- 条件が真の場合のみ&lt;p>タグを表示します -->
&lt;p *ngIf="condition">条件が真のときに表示されます&lt;/p></pre>



<p><span class="badge-blue">サンプルコード3</span>　<code>*ngFor</code>ディレクティブを使用して配列の各アイテムに対して要素を繰り返し表示</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!-- 配列itemsの各アイテムに対して&lt;li>タグを繰り返し表示します -->
&lt;ul>
  &lt;li *ngFor="let item of items">{{ item }}&lt;/li>
&lt;/ul></pre>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box not-nested-style cocoon-block-tab-caption-box"><div class="tab-caption-box-label block-box-label box-label fab-lightbulb"><span class="tab-caption-box-label-text block-box-label-text box-label-text">カスタム構造ディレクティブ</span></div><div class="tab-caption-box-content block-box-content box-content">
<p>カスタム属性ディレクティブとは、開発者が定義する属性ディレクティブの一種。標準の属性ディレクティブ（例えば、<code>ngStyle</code>や<code>ngClass</code>）以外に、アプリケーションの特定の要求に応じた特別なロジックやスタイリングを適用する必要がある場合に、カスタム属性ディレクティブを作成します。</p>



<p class="has-text-align-center"><span class="badge-blue">ポイント</span>　<strong>カスタム属性ディレクティブの作成ステップ</strong></p>



<ol class="wp-block-list">
<li><strong>ディレクティブクラスの作成</strong>
<ul class="wp-block-list">
<li class="is-style-bottom-margin-1em has-bottom-margin">Angular CLIのコマンド<code><span class="bold-blue">ng generate directive my-directive</span></code>を使用するか、手動でディレクティブクラスを作成します。ディレクティブのデコレーター<code><span class="bold-blue">@Directive</span></code>には、セレクターが指定され、このセレクターはディレクティブが適用される属性を識別します。</li>
</ul>
</li>



<li><strong>ロジックの実装</strong>
<ul class="wp-block-list">
<li class="is-style-bottom-margin-1em has-bottom-margin">ディレクティブクラス内に、要素の外見や振る舞いを変更するロジックを実装します。<code>ElementRef</code>を使用してディレクティブが適用されるDOM要素にアクセスし、<code>Renderer2</code>を使って要素のスタイルやプロパティを安全に変更します。</li>
</ul>
</li>



<li><strong>アプリケーションのモジュールにディレクティブを宣言</strong>
<ul class="wp-block-list">
<li>作成したディレクティブをアプリケーションのモジュール（通常は<code>AppModule</code>）の<code>declarations</code>配列に追加します。</li>
</ul>
</li>
</ol>



<p class="has-text-align-center"><span class="badge-blue">サンプル</span>　<strong>highlight.directive.ts</strong> (カスタム属性ディレクティブ)</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { Directive, ElementRef, HostListener } from '@angular/core';

@Directive({
  selector: '[appHighlight]'
})
export class HighlightDirective {
  constructor(private el: ElementRef) {}

  @HostListener('mouseenter') onMouseEnter() {
    this.highlight('yellow');
  }

  @HostListener('mouseleave') onMouseLeave() {
    this.highlight(null);
  }

  private highlight(color: string | null) {
    this.el.nativeElement.style.backgroundColor = color;
  }
}</pre>



<p class="has-text-align-center"><code>app.component.html</code>で<code>appHighlight</code>ディレクティブを使用する方法</p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;div appHighlight>This text will be highlighted when hovered over.&lt;/div></pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>カスタム属性ディレクティブを作成することで、アプリケーションの再利用可能なロジックやビジュアルエフェクトを効率的に管理できるようになります。</p>
</div></div>
</div></div>



<h3 class="wp-block-heading"><span id="toc8">3. 属性ディレクティブ（Attribute Directive）</span></h3>



<ul class="wp-block-list">
<li><strong>何をする？</strong>
<ul class="wp-block-list">
<li>既存のHTML要素やコンポーネントに対して、<strong>見た目や振る舞いを変更するための追加機能</strong>を付与するディレクティブです。</li>



<li>“HTMLタグそのものの構造を増減する”のではなく、“そのタグの属性やスタイルなどを動的に操作する”イメージです。</li>
</ul>
</li>



<li><strong>どんなイメージ？</strong>
<ul class="wp-block-list">
<li>「ある条件でクラスを切り替えたい」「スタイルを動的に変更したい」など、要素の属性に関わる部分をAngularの仕組みと連動させたいときに活躍します。</li>
</ul>
</li>



<li><strong>なぜ便利？</strong>
<ul class="wp-block-list">
<li>画面のデザインや動的変化をコード内のロジックと直接リンクできるので、UIの変更がわかりやすい。</li>



<li>Sassなどのスタイル管理とも相性がよく、UIの動的変更を細かく制御できます。</li>
</ul>
</li>
</ul>



<h4 class="wp-block-heading">代表的な属性ディレクティブ</h4>



<ol class="wp-block-list">
<li><strong><code>[ngClass]</code></strong>
<ul class="wp-block-list">
<li>条件に応じてクラスを追加・削除したり、複数のクラスを同時に切り替えたりできる。</li>



<li>例: <code>[ngClass]="{ 'active': isActive, 'error': hasError }"</code></li>
</ul>
</li>



<li><strong><code>[ngStyle]</code></strong>
<ul class="wp-block-list">
<li>スタイルをオブジェクト形式で動的に変更できる。</li>



<li>例: <code>[ngStyle]="{ 'background-color': bgColor }"</code></li>
</ul>
</li>



<li><strong><code>[ngModel]</code></strong>
<ul class="wp-block-list">
<li>フォーム要素（入力欄など）とデータをバインドするために使う。（Template-driven formsで利用）</li>
</ul>
</li>



<li><strong>その他カスタム属性ディレクティブ</strong>
<ul class="wp-block-list">
<li>Angularが用意しているディレクティブ以外にも、自分で作成して要素の見た目や挙動を拡張できます。</li>
</ul>
</li>
</ol>



<p><span class="badge-blue">サンプルコード4</span>　<strong><code>ngClass</code> の使用例</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;button 
  [ngClass]="{ 'btn-primary': isPrimary, 'btn-disabled': isDisabled }">
  ボタン
&lt;/button></pre>



<p><span class="badge-blue">サンプルコード5</span>　<strong><code>ngStyle</code>ディレクティブを使用して要素のスタイルを動的に適用</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!-- スタイルオブジェクトに基づいて動的にスタイルを適用 -->
&lt;div [ngStyle]="{'font-size': size + 'px'}">テキストサイズを動的に変更&lt;/div></pre>



<p>これらのディレクティブを利用することで、Angularアプリケーション内のHTML要素の外見や振る舞いを柔軟に制御することができます。構造ディレクティブと属性ディレクティブは、それぞれDOMの構造変更と要素のプロパティ/スタイルの変更という異なる目的で使用され、アプリケーションのUIをよりダイナミックにするために重要な役割を果たします。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<p class="has-text-align-center"><span class="badge-green">まとめ</span>　<strong>ディレクティブ</strong></p>



<ul class="wp-block-list">
<li><strong>コンポーネント</strong>：画面の部品（HTMLテンプレートとスタイル、振る舞いのセット）。</li>



<li><strong>構造ディレクティブ</strong>：HTMLの構造を動的に増やしたり減らしたり（<code>*ngIf</code>、<code>*ngFor</code> など）。</li>



<li><strong>属性ディレクティブ</strong>：要素のクラスやスタイルなどを動的に変化させる（<code>[ngClass]</code>、<code>[ngStyle]</code> など）。</li>
</ul>



<p>これら3つの役割をしっかり把握すると、「どのタイミングでどのディレクティブを使うのか」「表示するUIパーツはコンポーネントにまとめる」「要素の表示切り替えやクラスの変更は構造・属性ディレクティブで行う」といった使い分けが自然にできるようになります。結果として、コードの可読性や再利用性が高まり、大きなアプリケーションでも管理しやすいUI構造を作れるようになるでしょう。</p>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TypeScript：interface（インターフェース）の基本を３分で解説</title>
		<link>https://it-biz.online/web-design/interface/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Mon, 11 Mar 2024 04:53:40 +0000</pubDate>
				<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[WEBデザイン]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=8986</guid>

					<description><![CDATA[TypeScriptのinterfaceは、オブジェクトの構造を定義するための機能です。簡単に言うと、interfaceは特定のオブジェクトが持つべきプロパティやメソッドの「設計図」のようなものです。 interface [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>TypeScriptの<code><span class="bold-blue">interface</span></code>は、<strong>オブジェクトの構造を定義</strong>するための機能です。簡単に言うと、<code>interface</code>は特定のオブジェクトが持つべきプロパティやメソッドの「設計図」のようなものです。</p>



<p><code>interface</code>を適切に利用することで、コード内で一貫性と予測可能性を保ちながら、エラーを減らし開発プロセスをスムーズにすることができます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">interface User {
  name: string;
  age: number;
  isAdmin: boolean;
}

function registerUser(user: User) {
  // userオブジェクトがUserインターフェースに従っていることが保証されています。
}</pre>



<p class="has-text-align-center"><span class="badge-green">ポイント</span>　<strong><code>interface</code>の主なポイント</strong></p>



<ol class="wp-block-list">
<li class="is-style-bottom-margin-1em has-bottom-margin"><strong>型の定義:</strong> オブジェクトが特定の構造を持つことを保証。</li>



<li class="is-style-bottom-margin-1em has-bottom-margin"><strong>コードの再利用性向上:</strong> 同じインターフェースを様々な場所で再利用可能。</li>



<li class="is-style-bottom-margin-1em has-bottom-margin"><strong>開発プロセスの支援:</strong> エディタの自動補完機能により、プロパティやメソッドの入力を容易に。</li>



<li><strong>保守性の向上:</strong> コードベースが成長しても、型の安全性を維持しやすくなります。</li>
</ol>



<p><code>interface</code>を使うことで、<a href="https://it-biz.online/web-design/typescript-abc/">TypeScript</a>の型システムの全能力を活用し、より安全で読みやすく、保守しやすいコードを書くことができます。このページでは、TypeScriptのキーファクターとなる<code>interface</code>の基本～使い方、利用する際の注意点やTipsをわかりやすくご説明します。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>Webエンジニア/Webデザイナーを目指す方であれば<strong><span class="marker-under">知らないと恥ずかしい超・基本知識の１つ</span></strong>です。是非最後までご覧ください。</p>
</div></div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-20" checked><label class="toc-title" for="toc-checkbox-20">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">TypeScript：interaceとは？</a><ol><li><a href="#toc2" tabindex="0">ステップ１：インターフェースの定義</a></li><li><a href="#toc3" tabindex="0">ステップ２：インターフェースを使用してオブジェクト型を定義する</a></li><li><a href="#toc4" tabindex="0">ステップ３：任意プロパティの定義</a></li><li><a href="#toc5" tabindex="0">ステップ４：インターフェースの継承</a></li><li><a href="#toc6" tabindex="0">ステップ５：インターフェースを実装するクラス</a></li></ol></li><li><a href="#toc7" tabindex="0">インデックス署名</a></li><li><a href="#toc8" tabindex="0">関数型のインターフェース</a></li><li><a href="#toc9" tabindex="0">インターフェース宣言のマージ（Declaration Merging）</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">TypeScript：interaceとは？</span></h2>



<p><strong><span class="marker-under"><code>interface</code>（インターフェース）</span></strong>は、TypeScriptにおけるオブジェクトの形状（構造）を定義するため構文です。特定のオブジェクトが持つべきプロパティやメソッドの型を定義することで、コードの安全性と予測可能性を高めることが可能になります。</p>



<p>インターフェースは建物を建てる際の「設計図」のようなものだと考えるとわかりやすいかもしれません。設計図（インターフェース）は、建築物（オブジェクト）の構造を定義し、部屋の配置やサイズ、材料の種類や建物の耐久性など建築物が満たすべき具体的な要件（プロパティ）を示す役割を担います。</p>



<p><strong>設計図（インターフェース）の主な目的は、家がどのように見えどう機能するかを示すことです。</strong> 建築家（プログラマー）は、この設計図に基づいて家（オブジェクト）を構想しますが、実際に家を建てるのは建設業者（<a href="https://it-biz.online/web-design/typescript-calss/">クラス</a>）です。設計図は具体的な建築材料や建築方法を指定しませんが、最終的な建物が満たすべき基本的な要件や構造を定義します。</p>



<p>もし途中で窓をもう1つ追加することになった場合、設計図（インターフェース）にこの変更を加えるだけで、建設プロジェクト全体がこの新しい要件を反映するようになります。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>インターフェースの概要はここまで。実際のコードを見ていった方がより具体的にイメージが付きやすいと思いますので、ここからは、順を追ってインターフェースの定義方法～利用方法をご説明していきます。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc2">ステップ１：インターフェースの定義</span></h3>



<p>インターフェースの定義方法は以下の通り。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">interface インターフェース名 {
  プロパティ名: 型;
  // 他のプロパティやメソッドの定義
}</pre>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/web-design/variavle-type/">TypeScriptの基本的なデータ型</a></p>



<p>例えば、次のように<code><span class="bold-blue">Person</span></code>インターフェースを定義することができます。↓のインターフェースは、<code><span class="blue">name</span></code>プロパティが文字列型で、<code><span class="blue">age</span></code>プロパティが数値型であることを示しています。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">interface Person {
  name: string;
  age: number;
}</pre>



<p>インターフェースは他のインターフェースをネストすることも可能です。ネストすることで、プロパティがさらにオブジェクトであるような場合に、そのオブジェクトの形状を明確に指定することができるようになります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">interface Address {
  street: string;
  city: string;
  zipCode: number;
}

interface Person {
  name: string;
  age: number;
  address: Address; // Addressインターフェースを使用
}

const person: Person = {
  name: "Taro Yamada",
  age: 30,
  address: {
    street: "123 Maple St",
    city: "Tokyo",
    zipCode: 1000001
  }
};</pre>



<p>↑のサンプルコードでは、<code><span class="bold-blue">Person</span></code>インターフェースが<code><span class="blue">Address</span></code>インターフェースをネストして使用しています。これにより、<code><span class="bold-blue">person</span></code>オブジェクトに含まれる<code><span class="blue">address</span></code>プロパティが、<code>Address</code>インターフェースで定義された形状に従っていることが保証されます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ネストされたインターフェースを使用することで、実際のアプリケーションのデータ構造をより正確にモデル化できます。例えば、企業や製品のカタログ、ユーザーインターフェースのコンポーネントの設定など、階層的なデータ構造を持つ多くのシナリオで役立ちます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">interface Employee {
  name: string;
  position: string;
}

interface Company {
  name: string;
  employees: Employee[]; // Employeeインターフェースの配列
}

const myCompany: Company = {
  name: "Tech Solutions",
  employees: [
    { name: "John Doe", position: "Software Developer" },
    { name: "Jane Smith", position: "Project Manager" }
  ]
};</pre>
</div></div>



<h3 class="wp-block-heading"><span id="toc3">ステップ２：インターフェースを使用してオブジェクト型を定義する</span></h3>



<p>インターフェースを定義したら、それを使ってオブジェクトの型を指定することができます。以下のように、<strong>オブジェクトリテラル</strong>（<span class="bold-blue">{}</span>）でオブジェクトを作成する際に、その型としてインターフェースを指定します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// インターフェース定義
interface Person {
  name: string;
  age: number;
}

// オブジェクト定義
let john: Person = {
  name: "John Doe",
  age: 32
};</pre>



<p>ここで、<code><span class="bold-blue">john</span></code>オブジェクトは<code><span class="bold-blue">Person</span></code>インターフェースに従っているため、<code><span class="blue">name</span></code>と<code><span class="blue">age</span></code>プロパティを持っている必要があります。<strong><span class="marker-under">もしこれを満たさない場合、TypeScriptがコンパイル時にエラーを発生させます。</span></strong></p>



<p>このように「型」の不一致をエラーにすることで、予期せぬバグやオブジェクト間での不整合を防止することができます。</p>



<h3 class="wp-block-heading"><span id="toc4">ステップ３：任意プロパティの定義</span></h3>



<p>インターフェースでは<strong>任意プロパティ</strong>も定義することが可能です。これにより、あるプロパティがオブジェクトに<span class="marker-under">存在しなくても良い場合に柔軟に対応</span>することができるようになります。</p>



<p>任意プロパティはプロパティ名の後に<code><span class="bold-blue">?</span></code>をつけて定義します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">interface Profile {
  name: string;
  age?: number; // 任意プロパティ
}</pre>



<p>この<code><span class="bold-blue">Profile</span></code>インターフェースでは、<code><span class="blue">name</span></code>プロパティは必須ですが、<code><span class="blue">age</span></code>プロパティは任意→つまり、<code><span class="blue">age</span></code>プロパティを含む<code><span class="bold-blue">Profile</span></code>オブジェクトも、含まない<code><span class="bold-blue">Profile</span></code>オブジェクトも、どちらも<code>Profile</code>インターフェースの要件を満たすということです。</p>



<p class="has-text-align-center"><span class="badge-blue">サンプルコード</span>　<strong>任意プロパティの使用例</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">let person1: Profile = {
  name: "Alice"
};

let person2: Profile = {
  name: "Bob",
  age: 30
};</pre>



<p class="has-text-align-center"><span class="badge-green">ポイント</span>　<strong>任意プロパティの利点</strong></p>



<ul class="wp-block-list">
<li><strong>柔軟性:</strong> データモデルがすべてのプロパティを必須としない場合に柔軟に対応可能。</li>



<li><strong>進化するAPIへの対応:</strong> APIからのレスポンスなど、時間と共に変化する可能性のあるオブジェクト構造を表現する際に便利。</li>



<li><strong>オプションの設定:</strong> ユーザーによる設定オプションなど、存在しない場合にデフォルト値を使うプロパティの表現に適しています。</li>
</ul>



<p>任意プロパティを使う場合、プロパティが存在しない可能性を考慮したコードの記述が必要になります。例えば、<code>undefined</code>チェックを行うなどして、プログラムが安全に動作するようにします。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">if (person2.age !== undefined) {
  console.log(person2.age); // ageが存在する場合のみログを出力
}</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>以上のように、任意プロパティはTypeScriptのインターフェースを使った型定義の柔軟性を高める重要な機能です。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc5">ステップ４：インターフェースの継承</span></h3>



<p>インターフェースは他のインターフェースを継承し、新しいインターフェースを作成することができます。インターフェースを継承することで、既存のインターフェースのプロパティを新しいインターフェースに「引き継ぐ」ことができ、これにより複数のインターフェースの特性を組み合わせて、新しい複合型を形成することができます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>インターフェースの継承は<strong><span class="marker-under"><code>extends</code>キーワード</span></strong>を使用して行います。</p>
</div></div>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">interface NamedEntity {
  name: string;
}

interface Person extends NamedEntity {
  age: number;
}</pre>



<p>↑の例では、<code><span class="bold-blue">Person</span></code>インターフェースは<code><span class="bold-blue">NamedEntity</span></code>インターフェースから<code><span class="blue">name</span></code>プロパティを継承します。その結果、<span class="marker-under"><code>Person</code>インターフェースは<code>name</code>プロパティと<code>age</code>プロパティの両方を持つ</span>ことになります。</p>



<p>また、TypeScriptではインターフェースは複数のインターフェースを継承することができ、異なる特性を持つ複数のインターフェースを１つにまとめることができます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">interface NamedEntity {
  name: string;
}

interface Ageable {
  age: number;
}

interface Employee extends NamedEntity, Ageable {
  employeeId: number;
}</pre>



<p><code><span class="bold-blue">Employee</span></code>インターフェースは<code><span class="bold-blue">NamedEntity</span></code>と<code><span class="bold-blue">Ageable</span></code>の両方からプロパティを継承するので、<code>Employee</code>インターフェースは<code>name</code>、<code>age</code>、そして<code>employeeId</code>プロパティを持つことになります。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ただし、インターフェースの継承を使用する際は、継承の階層が複雑になりすぎないように注意する必要があります。</p>
</div></div>



<p>階層が深くなると、コードの理解やデバッグが難しくなる可能性があります。また、不必要に多くのプロパティやメソッドを含むインターフェースが形成されることを避けるため、継承を使用する際は慎重に設計することが重要です。</p>



<h3 class="wp-block-heading"><span id="toc6">ステップ５：インターフェースを実装するクラス</span></h3>



<p>クラスがインターフェースを実装するとき、そのクラスはインターフェースに定義されているすべてのプロパティとメソッドを持つ必要があります。これは、<strong><span class="marker-under"><code>implements</code>キーワード</span></strong>を使って行います。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">interface Greetable {
  greet(): void;
}

class Person implements Greetable {
  name: string;

  constructor(name: string) {
    this.name = name;
  }

  greet() {
    console.log(`Hello, my name is ${this.name}`);
  }
}</pre>



<p><code>Person</code>クラスは<code>Greetable</code>インターフェースを実装しています。これにより、<strong><span class="marker-under"><code>Person</code>クラスは<code>greet</code>メソッドを実装する必要があり</span></strong>、この契約を満たすために、<code>greet</code>メソッドがクラス内に定義されています。</p>



<p>なお、TypeScriptではクラスは複数のインターフェースを実装することができます。異なる機能のセットを組み合わせて、より複雑な振る舞いを持つクラスを作成できます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">interface Greetable {
  greet(): void;
}

interface Identifiable {
  id: number;
}

class Employee implements Greetable, Identifiable {
  name: string;
  id: number;

  constructor(name: string, id: number) {
    this.name = name;
    this.id = id;
  }

  greet() {
    console.log(`Hello, my name is ${this.name} and my ID is ${this.id}`);
  }
}</pre>



<p class="has-text-align-center"><span class="badge-blue">ポイント</span>　<strong>インターフェースの実装の利点</strong></p>



<ul class="wp-block-list">
<li class="is-style-bottom-margin-1em has-bottom-margin"><strong>型安全:</strong> インターフェースを実装するクラスは、インターフェースの契約に従う必要があるため、コードの型安全性が向上。</li>



<li class="is-style-bottom-margin-1em has-bottom-margin"><strong>再利用性と保守性:</strong> 共通のインターフェースを実装する複数のクラス間でコードを再利用しやすくなる。また、インターフェースを変更すると、それに依存するすべてのクラスに変更が自動的に反映されるため、保守性が向上する。</li>



<li><strong>柔軟性:</strong> インターフェースを利用することで、実装の詳細を抽象化し、クラス間の依存性を減らすことができる。</li>
</ul>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>インターフェースとクラスの関係性を理解し、適切に活用することで、より強力で柔軟なコードを書くことができます。</p>
</div></div>



<p>インターフェースの基本を押さえたところで、ここからはより実践的なテクニックやTipsをご紹介します。</p>



<h2 class="wp-block-heading"><span id="toc7">インデックス署名</span></h2>



<p><strong>インデックス署名</strong>は、TypeScriptにおいてオブジェクトのプロパティ名とその型があらかじめ特定できない場合に使える便利な機能です。いんですが署名は動的なプロパティ名に対応し、さまざまなキーとその値の型を柔軟に定義できます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>インデックス署名は以下の形式で定義されます。</p>
</div></div>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">interface インターフェース名 {
  [key: キータイプ]: バリュータイプ;
}</pre>



<p class="has-text-align-center"><span class="badge-blue">サンプルコード</span>　<strong>文字列のキーを持つ場合</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">interface StringDictionary {
  [key: string]: number;
}

const myDict: StringDictionary = {
  apple: 5,
  orange: 10,
  banana: 20
};</pre>



<p>↑の例では、<code><span class="bold-blue">StringDictionary</span></code>インターフェースは<strong><span class="marker-under">文字列のキーと数値の値を持つオブジェクト</span></strong>（[key: string]: number）を表します。この定義により、任意の文字列のキーに対して数値を割り当てることができるという仕組み。</p>



<p class="has-text-align-center"><span class="badge-blue">サンプルコード</span>　<strong>数値のキーを持つ場合</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">interface NumberDictionary {
  [index: number]: string;
}

const myArray: NumberDictionary = {
  10: "ten",
  20: "twenty",
  30: "thirty"
};</pre>



<p>インデックス署名を使用することで、オブジェクトのプロパティ名を動的に定義できるため、APIからのレスポンスなど予測不可能なプロパティ名を持つデータ構造を扱いやすくなります。また、インデックス署名により、キーと値の型を厳密に指定できるため、型安全性が向上します。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>インデックス署名を使用する際には、キーと値の型を正しく設定することが重要です。また、インデックス署名で定義された型以外のキーまたは値を割り当てようとすると、TypeScriptコンパイラはエラーを報告します。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc8">関数型のインターフェース</span></h2>



<p>TypeScriptでは、関数の型を定義する場合にもインターフェースを使用することができます。→関数が受け取る引数の型や返す値の型を厳密に指定することができ、プログラムの型安全性を向上させることができます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>関数のインターフェースを定義するには、インターフェース内に<strong>呼び出しシグネチャ</strong>を記述します。呼び出しシグネチャは、関数の引数のリストと戻り値の型を定義します。</p>
</div></div>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">interface 関数名 {
  (引数1: 型1, 引数2: 型2, ...): 戻り値の型;
}</pre>



<p class="has-text-align-center"><span class="badge-green">サンプルコード</span>　<strong>単純な関数インターフェース</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">interface GreetFunction {
  (name: string): string;
}

const greet: GreetFunction = function(name: string) {
  return `Hello, ${name}!`;
};

console.log(greet("Alice")); // "Hello, Alice!"</pre>



<p><code>GreetFunction</code>インターフェースは、<code>string</code>型の引数を1つ取り、<code>string</code>型の値を返す関数の型を定義しています。</p>



<p class="has-text-align-center"><span class="badge-green">サンプルコード</span>　<strong>複数の引数を取る関数インターフェース</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">interface CalculateSumFunction {
  (x: number, y: number): number;
}

const sum: CalculateSumFunction = function(x: number, y: number) {
  return x + y;
};

console.log(sum(1, 2)); // 3</pre>



<p>関数のインターフェースを使用することで、関数が期待する引数の型と戻り値の型を厳密に指定することが可能になります。結果、間違った型のデータを関数に渡すことを防ぎ、プログラムの安全性を向上させることに繋がります。また、関数インターフェースは関数がどのような引数を取り、どのような値を返すかを明確に示します。これにより、コードの可読性が向上し、他の開発者がコードを理解しやすくなるという利点があります。。</p>



<h2 class="wp-block-heading"><span id="toc9">インターフェース宣言のマージ（Declaration Merging）</span></h2>



<p>TypeScriptでは「<strong><span class="marker-under">宣言のマージ（Declaration Merging）</span></strong>」という強力な機能があります。これは、同じ名前の２つ以上の宣言を１つの宣言として合体させることができるという仕組みのこと。分散していたインターフェースの定義を統合し拡張することができます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">interface Animal {
  name: string;
}

interface Animal {
  age: number;
}

// マージされたインターフェース
// interface Animal {
//   name: string;
//   age: number;
// }</pre>



<p><code><span class="bold-blue">Animal</span></code>インターフェースが２つ定義されていますが、TypeScriptはこれらをマージして１つのインターフェースとして扱います。その結果、マージされた<code>Animal</code>インターフェースは<code>name</code>プロパティと<code>age</code>プロパティの両方を持つことになります。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>これらの機能と概念を理解することで、TypeScriptのインターフェースをより効果的に利用し、より安全でメンテナンスしやすいコードを書くことができるようになります。網羅的に学習することは大変価値があり、TypeScriptの強力な型システムの利点を最大限に活用することができます。</p>
</div></div>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
