# TypeScriptまとめ
[TOC]
以下は型推論によるものではなく、明示する場合。
## 変数の型
const 変数: 型 = 値
型はstring, number, booleanなど
```typescript=
const test: string = 'test'
```
## 配列
const 変数: string[] = ['値']
```typescript=
const test: string[] = ['test']
// 複数の型
const test: (string | number)[] = ['test', 0]
// タプル型(個数も順番も型も決まっている)
const test: [string, number] = ['test', 0]
```
## オブジェクト型
const 変数: { key: value, key2: value2 } = {
key: value,
key2: value
}
以下を型エイリアスという
type 型名 = {}
```typescript=
// string型のnameとnumber型のageのみを持つオブジェクトの型を定義
// ageはオプショナルなプロパティとして定義しているので、書かなくてもOK
type User = {
name: string;
age?: number;
}
const user: User = {
name: 'Taro',
age: 20
}
// キー名やキー数が事前に定まらないオブジェクト
type Label = {
[key: string]: string
}
```
### interface
クラスやデータの一側面を定義した型
interface 型名 {
プロパティ1: 型1;
プロパティ2: 型2;
}
```typescript=
interface Point {
x: number;
y: number;
}
// interfaceは後から型を追加できる。
interface Point {
z: number
}
```
## 関数
戻り値がない場合は、voidとする
function(引数1: 型1, 引数2: 型2): 戻り値 {
// 処理
}
```typescript=
function sayHello(name: string, greeting?: string): string {
return `${greeting}${name}`
}
seyHello('Taro', 'Hello')
```
## Enum型(列挙型)
列挙した値以外を代入できない型を定義できる
```typescript=
```
## ジェネリック(ジェネリクス)型
クラスや関数において、その中で使う型を抽象化し外部から具体的な型を指定するできる機能。
```typescript=
function repeat<T>(element: T, length: number): T[] {
const result: T[] = [];
for (let i = 0; i < length; i++) {
result.push(element);
}
return result;
}
// ["a","a","a","a","a"]が表示される
console.log(repeat<string>("a", 5));
// この場合は、型引数を入れなくても推論される
console.log(repeat("a", 5));
```
## Union型
ユニオン型は指定したいずれかの型に当てはまれば良い
```typescript=
type Test = number | string
const testVar: Test = 0
```
## Intersection型
複数の型をマージして、1つとなった型を生成する。
3つ以上の方の組み合わせでも可能
```typescript=
type Identity = {
id: number | string;
name: string;
}
type Contact = {
name: string;
email: string;
phone: string;
}
type Employee = Identity & Contact
const employee: Employee = {
id: 111,
name: 'Taro',
email: 'test@gmail.com',
phone: '090-1234-5678'
}
```
## リテラル型
決まった文字や数値しか入らなくできる。関数のreturnにも使える。
変数: 許可するデータ1 | 許可するデータ2...
```typescript=
const direction = 'up' | 'down'
```
## keyof
型に対してkeyofオペレーターを用いると、その型が持つ各プロパティの型のUnion型を返せる。
なので、typeのキー名を利用したい場合はkeyofを使う。
```typescript=
type Person = {
name: string;
old: number;
};
type Keys = keyof Person; // "name" | "old"
let keys: Keys;
keys = 'name'; // OK
keys = 'old'; // OK
keys = 'xxx'; // Error: Type '"xxx"' is not assignable to type '"name" | "old"'.
```
## anyとunkhown
anyはどちらもどんな型でも入れられるもの
```typescript=
let value: any;
value = 1; // OK
value = "string"; // OK
value = { name: "オブジェクト" }; // OK
```
unkhownはany同様どんな型でも入れられる。
ただし、変数を利用する際には、型を指定することでanyではできなかったコンパイル時のエラーを事前に検知できる。
```typescript=
let value: unknown;
// console.log(value.toLowerCase()) // NG
if (typeof value === 'string') {
console.log(value.toLowerCase())
}
```