📄️ 変数宣言: letとconst
JavaScriptの変数宣言(variable declaration)には、letとconstがあります。
📄️ 変数宣言の型注釈
TypeScriptでは変数宣言するときに、その変数にどんな値が代入可能かを指定できます。その指定のことを型注釈(type annotation; 型アノテーション)と言います。変数宣言の型注釈は、次のように変数名の右に型を書きます。
📄️ varはもう使わない
varは古い変数宣言の方法です。varにはいくつかの問題点がありました。それを解決するために、ES2015でletとconstが導入されました。ここでは、varとその問題点を説明します。新たにコードを書く場合にはvarは使わずにletとconstを使うことを推奨します。
📄️ 変数宣言の型推論
TypeScriptには型推論(type inference)と呼ばれる機能があります。型推論は、コンパイラが型を自動で判別する機能です。プログラマーは型推論を活用すると、型注釈を省略できるので、コードの記述量を減らせる利点があります。
📄️ 型推論と動的型付けの違い
型を書かないという意味では、JavaScriptをはじめRubyやPHPなどの動的型付け言語でも同様です。型推論と動的型付けは何が違うのでしょうか?
📄️ プリミティブ型
JavaScriptのデータ型は、プリミティブ型とオブジェクトの2つに分類されます。
📄️ boolean型
JavaScriptのboolean型は、trueとfalseの論理値からなる型です。
🗃️ number型
1項目
📄️ string型
文字列リテラル
📄️ null型
JavaScriptのnullは値がないことを示す値です。
📄️ undefined型
JavaScriptのundefinedは未定義を表すプリミティブな値です。変数に値がセットされていないとき、戻り値が無い関数、オブジェクトに存在しないプロパティにアクセスしたとき、配列に存在しないインデックスでアクセスしたときなどに現れます。
📄️ undefinedとnullの違い
多くのプログラミング言語で「値がない」を表現する方法は、nullなど1通りです。しかし、JavaScriptでは「値がない」に相当する表現にnullとundefinedの2通りがあります。他の言語からJavaScriptに来た人が驚き、使い分けに悩む部分です。ここでは、nullとundefinedの仕様上の違い、実際のコーディングでどう使い分けるべきかについて説明します。
📄️ symbol型
JavaScriptのsymbol型はプリミティブ型の一種で、その値が一意になる値です。boolean型やnumber型は値が同じであれば、等価比較がtrueになります。一方、シンボルはシンボル名が同じであっても、初期化した場所が違うとfalseになります。
📄️ bigint型
JavaScriptのbigint型は、number型よりも大きな整数を扱えるプリミティブ型です。
📄️ 型強制
JavaScriptにはデータ型がありますが、型が異なる2つの値に対し演算してもエラーにならない場合があります。たとえば、string型の"1"からnumber型の1を減算した場合、number型の0が計算結果として出てきます。
📄️ ボックス化
多くの言語では、プリミティブは一般的にフィールドやメソッドを持ちません。プリミティブをオブジェクトのように扱うには、プリミティブをオブジェクトに変換する必要があります。プリミティブからオブジェクトへの変換をボックス化(boxing)と言います。
📄️ リテラル型
TypeScriptではプリミティブ型の特定の値だけを代入可能にする型を表現できます。そのような型をリテラル型と呼びます。
📄️ any型
TypeScriptのany型は、どんな型でも代入を許す型です。プリミティブ型であれオブジェクトであれ何を代入してもエラーになりません。
🗃️ オブジェクト
15項目
📄️ 構造的型付け
プログラミング言語にとって、型システムは大事なトピックです。型システムとは、プログラム内のさまざまな値や変数に「型」を割り当てる決まりを指します。この決まりによってデータの性質や扱い方が決まります。特に、どのように型と型を区別するのか、逆に、どのように型同士が互換性ありと判断するかは、言語の使いやすさや安全性に直結するテーマです。
🗃️ 配列
10項目
📄️ タプル
TypeScriptの関数は1値のみ返却できます。ですが実際は複数の値を返したくなる時もあります。そんな時は配列に返したいすべての値を入れて返すことがあります。
🗃️ 列挙型
3項目
📄️ ユニオン型
TypeScriptのユニオン型(union type)は「いずれかの型」を表現するものです。
📄️ 判別可能なユニオン型
TypeScriptの判別可能なユニオン型は、ユニオンに属する各オブジェクトの型を区別するための「しるし」がついた特別なユニオン型です。オブジェクトの型からなるユニオン型を絞り込む際に、分岐ロジックが複雑になる場合は、判別可能なユニオン型を使うとコードの可読性と保守性がよくなります。
📄️ インターセクション型
考え方はユニオン型と相対するものです。ユニオン型がどれかを意味するならインターセクション型はどれもです。言い換えるとオブジェクトの定義を合成させることを指します。
📄️ 型エイリアス
TypeScriptでは、型に名前をつけられます。名前のついた型を型エイリアス(タイプエイリアス; type alias)と呼びます。
📄️ 型アサーション「as」
TypeScriptには、型推論を上書きする機能があります。その機能を型アサーション(type assertion)と言います。
📄️ constアサーション「as const」
オブジェクトリテラルの末尾にas constを記述すればプロパティがreadonlyでリテラルタイプで指定した物と同等の扱いになります。
📄️ 明確な割り当てアサーション
明確な割り当てアサーションは、変数やプロパティが確実に初期化されていることをTypeScriptのコンパイラに伝える演算子です。
📄️ typeof演算子
JavaScriptのtypeof演算子では値の型を調べることができます。
📄️ 等価であるということ
どの言語でも、値を比較することがあります。JavaScriptにおいて等価の演算子は等価演算子(==)と厳密等価演算子(===)のふたつがあります。等しいことを判定するための演算子がふたつ存在するのは、必ずしも同じものを等しいとはしないためです。
📄️ truthyな値、falsyな値
特定の条件で処理を変えたい
📄️ 型のメンタルモデル
型システムの背景理論