CreateLife ~AlwaysLatest~

【基礎を学ぶ】TypeScriptの「型」について深掘りする

TypeScript

そもそもTypeScriptとは

JavaScriptは実行時にデータ型を決める動的型付けです。動的型付けには、実行時にデータ型が自動で決まるため実行するまでエラーの存在に気付きにくく、バグが起こりやすいという問題点がありました。この問題を解決するため、TypeScriptではあらかじめ変数の型を定義する静的型付けを採用しました。

との事。厳密なJavaScriptという事ですね。
Next.jsを学ぶにあたり、TypeScriptの壁に当たったので基礎を学ぶことにします。

参考教材

目次

  • 「TypeScriptの型」と「JavaScriptの型」
  • 「型推論」「型注釈」
  • タプル型
  • Enum
  • any型の扱い
  • ユニオン型
  • リテラル型
  • タイプエイリアス
  • 関数に型をつける
  • まとめ

「TypeScriptの型」と「JavaScriptの型」

TypeScriptの型とJavaScriptの型は別物。
JavaScriptの型にはなくてTypeScriptにある型がたくさんある。

「型推論」「型注釈」

型推論

コンパイラが推測する型の事

// プリミティブ
let count = 10;
// オブジェクト
const person: {
  name: 'Jack',
  age: 21,
}
// 配列
const fruit = ['Apple', 'Banana', 'Grape'];

型注釈

明示的に型を指定する

// プリミティブ
let count: number = 10;
// オブジェクト
const person: {
  name: string;
  age: number;
} = {
  name: 'Jack',
  age: 21,
}
// 配列
const fruit: string[] = ['Apple', 'Banana', 'Grape'];

どちらを使うか?

基本的には型推論を使い、型推論できない時に型注釈を使う

タプル型

決まった配列を入れたい時

// カテゴリ、値段、売り切れか、みたいな情報を決まって入れるとして、、
const book = ['business', 1500, false];
↓
const book: [string, number, boolean] = ['business', 1500, false];

Enum

列挙型(特定のまとまったグループのみを受け入れる型)

enum CoffeeSize {
  SHORT = 'SHORT',
  TALL = 'TALL',
  GRANDE = 'GRANDE',
  VENTI = 'VENTI'
}

const coffee = {
  hot: true,
  size: CoffeeSize.TALL
}
# 値を変更したい時
coffee.size = CoffeeSize.SHORT;

any型の扱い

anyは何でも入る。型定義した変数にも入ってしまう。
JavaScriptのプロジェクトをTypeScriptに変更するときの一次処置などには使える。
TypeScriptで書くときはなるべく使わないようにする。

ユニオン型

複数の型を入れられる

let unionType: number | string = 10;
unionType = toUpperCase(); // エラー
unionType = 'hello';
unionType = toUpperCase(); // エラーにならない

let unionTypes: (number | string)[] = [32, 'hello'];

リテラル型

決まった値のみ扱うもの

const apple: 'apple' = 'hello' // エラー
const apple: 0 = 43; // エラー

タイプエイリアス

事前に型を定義しておくことで使いまわせる

// 定義
type ClothSize = 'small' | 'medium' | 'large';
// 使う
let clothSize: ClothSize = 'large';
const cloth: {
  color: string;
  size: ClothSize
} = {
  color: 'white',
  size: 'medium'
}

関数に型をつける

関数宣言時

引数と戻り値につける
戻り値には型推論が効くので引数はマストでつける
戻り値にもつけることでドキュメント代わりになる

function add(num1: number, num2: number): number {
  return num1 + num2;
}

関数の型注釈

上記で定義したadd関数を変数に代入する場合

// 通常
const anotherAdd = add;
// 型注釈
const anotherAdd: (n1: number, n2: number) => number = add;

コールバック関数

function doubleAndHandle(num: number, cb: (num: number) => number): void {
  const doubleNum = cb(num * 2);
  console.log(doubleNum);
}
doubleAndHandle(21, doubleNum => {
  return doubleNum;
});

まとめ

どんな言語を扱う際にも「型」への意識をしっかり持って書くことでTypeScriptへの参入障壁は低くなるような気がしました。普段から意識しよう。