TypeScript - 型注釈:入門者のガイド

こんにちは、将来のプログラミングスーパースターさん!? TypeScriptと型注釈の世界へのエキサイティングな旅へようこそ。あなたの近所の親切なコンピュータサイエンスの先生として、この冒険を案内することを楽しみにしています。プログラミングが初めての方でも心配しないでください。一緒に基礎から始め、少しずつ進んでいきましょう。では、虚拟のバックパックを持ち出して、一緒に飛び込んでみましょう!

TypeScript - Type Annotations

型注釈とは?

旅の準備をしていると考えてみてください。服、化粧品、電子機器など、異なるアイテムには異なるバッグを使います。TypeScriptの型注釈は、これらのバッグに付けるラベルのようです。それらは、私たちとコンピュータにどのような「もの」(データ)を扱っているかを教えます。

TypeScriptの世界では、型注釈は変数、関数のパラメータ、オブジェクトのプロパティが保持できる値の型を明示的に伝える方法です。コンピュータに期待されることを事前に知らせるようなものです。

型注釈を使う理由は?

  1. 早めにエラーをキャッチ: コードを実行する前に間違いを見つけるのを助けます。
  2. コードのドキュメント化: コードをより理解しやすくします。
  3. 開発体験の向上: コードエディタでの自動補完やIntelliSenseを提供します。

では、型注釈を使うさまざまな方法を見てみましょう。

変数の型注釈

TypeScriptで変数を作成する際に、型注釈を追加してどのような値を保持すべきかを指定できます。

基本構文

let 変数名: 型 = 値;

いくつかの例を見てみましょう:

let myName: string = "Alice";
let myAge: number = 30;
let isStudent: boolean = true;

これらの例では、TypeScriptに以下を伝えています:

  • myName はテキスト(文字列)のみを含むべきです
  • myAge は数値のみを含むべきです
  • isStudent は true または false(ブール値)のみを含むべきです

後で異なる型の値を割り当てようとすると、TypeScriptは警告を表示します:

myName = 42; // エラー: 型 'number' は 'string' に割り当てられません

配列と特殊な型

配列や特殊な型も注釈できます:

let favorites: string[] = ["pizza", "coding", "cats"];
let anything: any = "I can be anything!";
let maybe: unknown = 4;
  • string[] は文字列の配列を意味します
  • any は何でもできる特殊な型です(控えめに使用してください!)
  • unknownany より安全な代替です

関数の型注釈

関数はパラメータと返り値に型注釈を付けられます。

基本構文

function 関数名(パラメータ1: 型1, パラメータ2: 型2): 返り値の型 {
// 関数の本体
}

いくつかの例を見てみましょう:

function greet(name: string): string {
return `Hello, ${name}!`;
}

function add(a: number, b: number): number {
return a + b;
}

function logMessage(message: string): void {
console.log(message);
}

これらの例では:

  • greet は文字列を取り、文字列を返します
  • add は二つの数値を取り、数値を返します
  • logMessage は文字列を取り、何も返しません(void

箭頭関数

箭頭関数にも型注釈を付けられます:

const multiply = (a: number, b: number): number => a * b;

オブジェクトのプロパティの型注釈

オブジェクトを扱う際に、そのプロパティに型注釈を付けられます。

基本構文

let オブジェクト名: { プロパティ1: 型1; プロパティ2: 型2 } = {
プロパティ1: 値1,
プロパティ2: 値2
};

いくつかの例を見てみましょう:

let user: { name: string; age: number; isAdmin: boolean } = {
name: "Bob",
age: 25,
isAdmin: false
};

ここでは、特定のプロパティ型を持つオブジェクトを定義しています。

インターフェース

より複雑なオブジェクトにはインターフェースを使用します:

interface Person {
name: string;
age: number;
hobbies: string[];
greet: () => void;
}

let employee: Person = {
name: "Charlie",
age: 30,
hobbies: ["reading", "gaming"],
greet: () => console.log("Hello!")
};

インターフェースは、再利用可能なオブジェクトの形状を定義するのに役立ちます。

すべてを合わせて

さまざまな型注釈について学んだので、もっと複雑な例でそれらを見てみましょう:

interface Book {
title: string;
author: string;
pages: number;
isPublished: boolean;
}

function createBookList(books: Book[]): string[] {
return books.map(book => `${book.title} by ${book.author}`);
}

const myBooks: Book[] = [
{ title: "TypeScript 101", author: "Code Wizard", pages: 200, isPublished: true },
{ title: "JavaScript Adventures", author: "JS Ninja", pages: 150, isPublished: false }
];

const bookTitles: string[] = createBookList(myBooks);
console.log(bookTitles);

この例では、以下の概念を組み合わせています:

  • Book インターフェースを定義します
  • createBookList 関数は Book オブジェクトの配列を取り、文字列の配列を返します
  • Book オブジェクトの配列を作成します
  • 関数を呼び出し、結果を適切な型の変数に格納します

結論

おめでとうございます!TypeScriptの型注釈の世界への初めてのステップを踏み出しました。これらの注釈は、あなたとあなたのコードを安全に導く親切なサインポストのようなものです。最初は少し圧倒されるかもしれませんが、練習を重ねるうちに自然になるでしょう。

コードを書き続け、好奇心を持ち続けてください。間違ったことを恐れずに - すべての達人もかつては初心者でした。ハッピータイプスクリプト!??‍??‍?

Credits: Image by storyset