TypeScriptの変数・関数の型注釈とは?書き方を初心者向けに解説

TypeScriptの変数・関数の型注釈とは?書き方を初心者向けに解説

 

TypeScriptの型注釈とは

TypeScriptの型注釈とは、変数や関数に対して「どんな型の値を扱うか」を明示する書き方です。変数の後ろや関数の引数・戻り値に: 型名という形で記述します。

少年A
コロンの後ろに型を書くってやつ、なんとなく真似して書いてるけど、ちゃんと理解できてないかも
キノ
実はここ、応用が少なくて一番「型に慣れる」のに向いてる場所だから、今日はここだけ丁寧にやろう
スポンサーリンク

なぜ型注釈が必要なのか

JavaScriptでは、変数にどんな値でも自由に代入できます。

// JavaScript
let price = 1000;
price = "1000円"; // 数値のつもりが文字列に変わっても、実行するまで気づけない

型注釈を付けておけば、こうした意図しない変化をコードを書いている段階で検知できます。特に関数は複数の場所から呼び出されることが多いため、引数や戻り値の型を明示しておくメリットが大きくなります。

スポンサーリンク

変数の型注釈の書き方

変数名の後ろに: 型名を書きます。

let name: string = "kino";
let age: number = 30;
let isStudent: boolean = false;

基本の型はstring(文字列)、number(数値)、boolean(真偽値)の3つを押さえておけば、日常的なコードの大半はカバーできます。

関数の引数の型注釈

関数の引数にも、変数と同じ書き方で型を指定します。

function greet(name: string) {
  console.log(`こんにちは、${name}さん`);
}

greet("kino");   // OK
greet(123);      // Error: Argument of type 'number' is not assignable to parameter of type 'string'.

引数の型注釈は省略できないルールになっています。TypeScriptが引数の型まで推論してくれることはないため、関数を書くときは必ず引数に型を書く癖をつけておくと安全です。

関数の戻り値の型注釈

戻り値の型は、引数リストの後ろに書きます。

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

戻り値の型は、実は多くの場合で省略可能です(TypeScriptがreturnの中身から自動で推論してくれます)。ただし、意図しない型が返ってしまうミスに気づきやすくするため、あえて明示しておくのがおすすめです。何も値を返さない関数には、voidという型を使います。

function logMessage(message: string): void {
  console.log(message);
  // 何も return しない
}

デフォルト引数・オプション引数の書き方

「値を渡さなかったときの初期値」を決めておきたい場合は、デフォルト引数を使います。

function greet(name: string, honorific: string = "さん") {
  console.log(`${name}${honorific}、こんにちは`);
}

greet("kino");         // "kinoさん、こんにちは"
greet("kino", "先生"); // "kino先生、こんにちは"

「渡しても渡さなくてもいい引数」にしたいだけであれば、オブジェクトの型定義でも紹介した?を引数にも使えます。

function greet(name: string, honorific?: string) {
  console.log(`${name}${honorific ?? ""}、こんにちは`);
}

配列やオブジェクトの型定義における?の使い方は、こちらの記事でも紹介しています。

アロー関数の型注釈

Reactのコードなどでよく使うアロー関数も、書き方はほぼ同じです。

const add = (a: number, b: number): number => {
  return a + b;
};

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

通常の関数と違い、アロー関数は変数に代入する形になるため、変数側に型注釈を付けたくなるかもしれませんが、上記のように引数・戻り値それぞれに書くのが基本の形です。

型注釈を省略していい場面

ここまで「型注釈を書く」ことを中心に説明してきましたが、実はすべての場所に書く必要はありません。

let count = 0; // number型として自動推論されるので、型注釈は省略してOK

初期値から型が明らかな変数や、多くの関数の戻り値は、TypeScriptの型推論に任せて省略しても問題ありません。逆に、関数の引数のように推論できない場所には必ず書く、というメリハリを意識すると、コードもすっきりします。型推論の詳しい仕組みはこちらの記事で解説しています。

よくあるエラー

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

add(1); // Error: Expected 2 arguments, but got 1.

これは、関数が必要としている引数の数と、実際に渡した数が合っていないために起きるエラーです。デフォルト引数やオプション引数(?)を使っていない引数は、必ず渡す必要があります。

よくある質問

Q. 型注釈は必ず書かないといけませんか?
A. いいえ。関数の引数以外は、型推論に任せて省略できる場面が多いです。ただし、意図を明確にするためにあえて書くこともよくあります。

Q. voidとは何ですか?
A. 何も値を返さない関数の戻り値に使う型です。returnを書かない関数によく使われます。

Q. デフォルト引数とオプション引数はどう使い分けますか?
A. 「値を渡さなかったときの初期値」を決めたいならデフォルト引数、「渡さなくてもエラーにしたくない」だけならオプション引数(?)を使います。

まとめ

  • 型注釈は変数・関数の後ろに: 型名という形で書く
  • 関数の引数の型注釈は省略できないが、戻り値や初期値のある変数は省略できることが多い
  • デフォルト引数・オプション引数を使い分けると、柔軟な関数が書ける
  • アロー関数も、通常の関数と同じ考え方で型注釈を付けられる

公式ドキュメントにも、関数の型についてのより詳しい解説があります。

TypeScript公式ドキュメント:More on Functions

少年A
引数は必ず書く、戻り値は省略していい場合もある、って考えるとシンプルだね
キノ
うん。ここが体に馴染むと、他の記事で書いたinterfaceやジェネリクスもぐっと読みやすくなるよ

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です