TypeScriptの様々な型注釈

## アジェンダ
TypeScriptには、さまざまな型があります。この記事では、これらの型の概要を簡単にまとめます。これらの型を理解することで、より堅牢で安全なコードを書くことができます。

## 様々な型の概要

### リテラル型

リテラル型は、特定の値のみを許容する型です。これは、値の制約を強化するために使用されます。

```tsx
type Direction = 'North' | 'South' | 'East' | 'West';
```

上記の例では、`Direction`型は`'North'`, `'South'`, `'East'`, `'West'`のいずれかの文字列のみを取ることができます。

### プリミティブ型

プリミティブ型は、基本的なデータ型であり、イミュータブルな性質を持ちます。これらの型には、`string`、`number`、`boolean`などがあります。

```tsx
type PrimitiveString = string;
type PrimitiveNumber = number;
```

プリミティブ型は、単純でありながら、JavaScriptの基本的な型システムの中心を成しています。

### オブジェクトの型注釈

オブジェクト型は、複雑なデータ構造を扱う型です。オブジェクト型注釈を使用することで、オブジェクトの構造を明確に定義できます。

```tsx
type User = {
  id: number;
  name: string;
  age: number;
};
```

上記の例では、`User`型は、`id`, `name`, `age`のプロパティを持つオブジェクトを表しています。

### 配列の型注釈

配列の型注釈は、配列内の要素の型を定義します。これにより、配列が持つべき要素の型を明確にできます。

```tsx
type NumberArray = number[];
```

この例では、`NumberArray`型は、`number`型の要素のみを含む配列を表します。

### ユニオン型

ユニオン型は、複数の型を組み合わせて、一つの型として扱うことができます。これは、変数が複数の型を取る可能性がある場合に使用されます。

```tsx
type ID = string | number;
```

この例では、`ID`型は、`string`型または`number`型の値を取ることができます。

### インターセクション型

インターセクション型は、複数の型を組み合わせて、一つの型に統合することができます。これは、複数の型のプロパティを持つオブジェクトを定義する際に便利です。

```tsx
type Nameable = {
  name: string;
};

type Ageable = {
  age: number;
};

type Person = Nameable & Ageable;
```

上記の例では、`Person`型は、`name`と`age`の両方のプロパティを持つオブジェクトを表しています。

### 型エイリアス

型エイリアスは、複雑な型定義に名前を付けて再利用しやすくするためのものです。型エイリアスを使うことで、コードの可読性が向上します。

```tsx
type User = {
  id: number;
  name: string;
  age: number;
};
```

型エイリアスは、プリミティブ型やオブジェクト型など、どんな型でも定義することができます。

### 型アサーション

型アサーションは、TypeScriptに対して「この値は特定の型である」と明示的に示す方法です。これは、コンパイラが型を誤解する可能性がある場合に有効です。

```tsx
let someValue: unknown = "this is a string";
let strLength: number = (someValue as string).length;
```

この例では、`someValue`が`unknown`型であるにもかかわらず、`string`型として扱うことができ、その結果`length`プロパティにアクセスできます。

## 参考
- [変数宣言の型注釈 (type annotation) | TypeScript入門『サバイバルTypeScript』](https://typescriptbook.jp/reference/values-types-variables/type-annotation)
- [リテラル型 (literal type) | TypeScript入門『サバイバルTypeScript』](https://typescriptbook.jp/reference/values-types-variables/literal-types)
- [プリミティブ型 (primitive types) | TypeScript入門『サバイバルTypeScript』](https://typescriptbook.jp/reference/values-types-variables/primitive-types)
- [オブジェクトの型注釈 (type annotation) | TypeScript入門『サバイバルTypeScript』](https://typescriptbook.jp/reference/values-types-variables/object/type-annotation-of-objects)
- [配列の型注釈 (type annotation) | TypeScript入門『サバイバルTypeScript』](https://typescriptbook.jp/reference/values-types-variables/array/type-annotation-of-array)
- [ユニオン型 (union types) | TypeScript入門『サバイバルTypeScript』](https://typescriptbook.jp/reference/values-types-variables/union-types)
- [インターセクション型 (intersection types) | TypeScript入門『サバイバルTypeScript』](https://typescriptbook.jp/reference/values-types-variables/intersection-types)
- [型エイリアス (type alias) | TypeScript入門『サバイバルTypeScript』](https://typescriptbook.jp/reference/values-types-variables/type-alias)
- [型アサーション (type assertion) | TypeScript入門『サバイバルTypeScript』](https://typescriptbook.jp/reference/values-types-variables/type-assertion) 
- [TypeScriptの型定義まとめ【Reactも対応】](https://zenn.dev/akkie1030/articles/9f2304544245b2)