この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:5
ページ更新者:爽健
更新日時:2026-06-11 07:12:00

タイトル: データ型一覧
SEOタイトル: TypeScript データ型一覧完全ガイド

この記事の要点
  • Primitive: number / string / boolean / bigint / symbol / undefined / null
  • 特殊: any / unknown / never / void
  • 複合: Object / Array / Tuple / Enum / Function
  • リテラル型Union/Intersection で柔軟に組み立てられる
  • Utility Types (Partial / Required / Pick / Omit / Record / Readonly) で既存型を加工

型の全体マップ

分類
Primitivenumber1 / 3.14 / NaN
string"hello"
booleantrue / false
bigint123n
symbolSymbol("id")
undefinedundefined
nullnull
特殊any何でも
unknown何でも、絞らないと使えない
never絶対起きない
void戻り値なし
複合object / {}{ a: 1 }
配列number[] / Array<T>
タプル[string, number]
列挙enum Color { ... }
関数(x: number) => string

Primitive Types

// number (整数・浮動小数点・特殊値全部)
let n1: number = 42;
let n2: number = 3.14;
let n3: number = 0xff;       // 16進
let n4: number = 0b1010;     // 2進
let n5: number = 0o755;      // 8進
let n6: number = NaN;
let n7: number = Infinity;

// string
let s1: string = &quot;hello&quot;;
let s2: string = 'world';
let s3: string = `tagged ${n1}`;   // テンプレートリテラル

// boolean
let b: boolean = true;

// bigint (ES2020)
let bi: bigint = 1234567890123456789n;
let bi2: bigint = BigInt(&quot;9007199254740993&quot;);

// symbol
let sym: symbol = Symbol(&quot;id&quot;);
let sym2: symbol = Symbol.for(&quot;global&quot;);

// undefined / null
let u: undefined = undefined;
let nl: null = null;

any / unknown / never / void

// any: 何でも入る、何でもできる (型チェック完全無効)
let a: any = 42;
a = &quot;hello&quot;;
a.toUpperCase();    // チェックされない (実行時エラー可能性)

// unknown: 何でも入るが、使う前に型を絞る必要あり
let u: unknown = 42;
// u.toUpperCase();  // ❌ unknown は呼べない
if (typeof u === &quot;string&quot;) {
  u.toUpperCase();  // ✅ ここでは string と判明
}

// never: 絶対に存在しない値の型
function fail(msg: string): never {
  throw new Error(msg);
}
function infinite(): never {
  while (true) {}
}

// void: 戻り値が無い (undefined を返すと同義)
function log(msg: string): void {
  console.log(msg);
}

Object 型

// オブジェクトリテラル型
let user: { name: string; age: number } = { name: &quot;山田&quot;, age: 30 };

// interface
interface User {
  name: string;
  age: number;
  email?: string;       // Optional
  readonly id: number;  // 読み取り専用
}

// type alias
type Point = {
  x: number;
  y: number;
};

// Index Signature (任意キー)
type StringDict = { [key: string]: string };

// {}, object, Object の違い
let x1: {} = &quot;anything&quot;;       // null / undefined 以外何でも (緩い)
let x2: object = { a: 1 };     // オブジェクトのみ (Primitive 不可)
let x3: Object = &quot;abc&quot;;        // Object 型 (≒ {})
// → {} / Object は使わず、明示的に型を書くのが推奨

Array と Tuple

// 配列 (2 つの書き方)
let arr1: number[] = [1, 2, 3];
let arr2: Array<number> = [1, 2, 3];

// 多次元
let matrix: number[][] = [[1, 2], [3, 4]];

// readonly 配列 (要素追加不可)
let ro: readonly number[] = [1, 2, 3];
// ro.push(4);  // ❌

// Tuple (要素数と型が固定)
let pair: [string, number] = ["age", 30];
let triple: [string, number, boolean] = ["taro", 30, true];

// Optional Tuple (TS 3.0+)
let opt: [string, number?] = ["a"];

// Rest Tuple
let rest: [string, ...number[]] = ["sum", 1, 2, 3];

// Named Tuple (TS 4.0+)
let xy: [x: number, y: number] = [10, 20];

Enum

// Numeric Enum (デフォルト)
enum Direction {
  Up,       // 0
  Down,     // 1
  Left,     // 2
  Right,    // 3
}
let d: Direction = Direction.Up;

// 初期値指定
enum HttpStatus {
  OK = 200,
  NotFound = 404,
  Error = 500,
}

// String Enum (推奨: 値が文字列なので可読性が高い)
enum Color {
  Red = &quot;red&quot;,
  Green = &quot;green&quot;,
  Blue = &quot;blue&quot;,
}

// const enum (ビルド時にリテラル展開、JS に enum 自体は残らない)
const enum LogLevel {
  Debug, Info, Warn, Error,
}
console.log(LogLevel.Info);  // → console.log(1) に変換

リテラル型

// 値そのものを型にする
let one: 1 = 1;
let hello: "hello" = "hello";

// Union と組み合わせて「許す値」を制限
type Direction = "up" | "down" | "left" | "right";
let d: Direction = "up";
let d2: Direction = "north";   // ❌

// Numeric Literal
type Dice = 1 | 2 | 3 | 4 | 5 | 6;

// Boolean Literal
type Truthy = true;

// Template Literal Type (TS 4.1+)
type Greeting = `Hello, ${string}`;
type Event = `on${Capitalize<string>}`;   // "onClick" / "onChange" など

Union / Intersection

// Union: AかBかCのどれか
type ID = string | number;
type Result<T> = { ok: true; data: T } | { ok: false; error: string };

// Intersection: AかつBかつC
type WithId = { id: number };
type WithName = { name: string };
type Person = WithId & WithName;   // { id: number; name: string }

Function 型

// 関数型
type BinaryOp = (a: number, b: number) => number;
const add: BinaryOp = (a, b) => a + b;

// Call Signature (オブジェクト型として)
type CallableLog = {
  (msg: string): void;
  level: "info" | "warn" | "error";
};

// Construct Signature
type Constructor<T> = new (...args: any[]) => T;
function create<T>(C: Constructor<T>): T {
  return new C();
}

// Overload
function f(x: string): string;
function f(x: number): number;
function f(x: string | number) { return x; }

Utility Types (組み込み便利型)

Utility効果
Partial<T>全プロパティを Optional に
Required<T>全プロパティを必須に
Readonly<T>全プロパティを readonly に
Pick<T, K>K で指定したプロパティだけ抜粋
Omit<T, K>K で指定したプロパティを除外
Record<K, V>K をキー、V を値とするオブジェクト型
Exclude<T, U>Union から U を除外
Extract<T, U>Union から U に該当する型だけ抽出
NonNullable<T>null/undefined を除外
ReturnType<F>関数の戻り値型を取得
Parameters<F>関数の引数型タプルを取得
Awaited<P>Promise を unwrap
type User = { id: number; name: string; email: string };

type PartialUser = Partial<User>;       // 全部 Optional
type UserName = Pick<User, "name">;     // { name: string }
type WithoutEmail = Omit<User, "email">;// { id: number; name: string }

type Dict = Record<string, number>;     // { [k: string]: number }

type Statuses = "active" | "inactive" | "deleted";
type Visible = Exclude<Statuses, "deleted">;   // "active" | "inactive"

async function fetchUser(): Promise<User> { /* ... */ }
type FetchResult = Awaited<ReturnType<typeof fetchUser>>;  // User

function f(a: number, b: string) {}
type Args = Parameters<typeof f>;     // [number, string]
type Ret = ReturnType<typeof f>;      // void

型の幅 (Widening) と Narrowing

// Widening: const は narrow、let は wide
const a = &quot;hello&quot;;   // 型: &quot;hello&quot; (リテラル)
let b = &quot;hello&quot;;     // 型: string

// const アサーションで強制 narrow
const c = &quot;hello&quot; as const;        // &quot;hello&quot;
const d = [&quot;a&quot;, 1] as const;       // readonly [&quot;a&quot;, 1]
const e = { a: 1 } as const;       // { readonly a: 1 }

// Narrowing (型ガードで絞る)
function f(x: string | number) {
  if (typeof x === &quot;string&quot;) {
    x.toUpperCase();  // ここでは string
  } else {
    x.toFixed(2);     // ここでは number
  }
}

FAQ

Q: Stringstring の違いは?
A: string は Primitive、String はラッパーオブジェクト型。常に小文字 string を使います。

Q: any[]unknown[]?
A: any[] は要素を何でも使える危険型、unknown[] は安全だが利用前に型を絞る必要あり。原則 unknown[]

Q: Tuple と配列の違いは?
A: Tuple は長さと各位置の型が固定[string, number] は 2 要素のみで型順序が決まっています。