Zenn
🐧

readonly, union, Pick, Extract, Awaitedなどの型定義を紹介

2025/03/23に公開

最近学んだ型定義をいくつか紹介します。

1. readonly

readonlyは、オブジェクト型のプロパティを読み取り専用にすることができます。

type TestItem = {
	readonly label: string
	readonly content: string
}
export const ProfileInfo = ({ label, content }: TestItem) => {
	return (
		<>
			<p>{label}</p>
			<p>{content}</p>
		</>
	)
}

これを使うことで、値を書き換えようとするとコンパイルエラーが起きます。

	const item: TestItem = { label: "名前", content: "田中 太郎" }
	item.label = "年齢"
    //読み取り専用プロパティであるため、'label' に代入することはできません。

明示的に表示用を表したい場合は便利です。

2. ユニオン型

ユニオン型は2種類以上の型定義をできます。
下記だとstring, numberの型定義をできます。

let value: string | number

そのため、複数の型定義をしたい場合には便利です。

3. Pick

Pickは、オブジェクト型から特定のプロパティだけを選択して新しい型を作るユーティリティ型です。

type User = {
  id: number
  name: string
  email: string
  age: number
}

// User から "id" と "name" だけを抽出
type UserSummary = Pick<User, "id" | "name">

const user: UserSummary = {
  id: 1,
  name: "田中 太郎",
  // email: "tanaka@example.com"  // エラー: email は UserSummary に存在しない
}

使いどころとしては、必要なプロパティだけを抽出し、型をシンプルにする場合や、
APIのレスポンス型を一部利用する場合に便利です。

自分も下記のように使ってたりします。

export interface GetUser {
  admin: number
  bio: string
  email: string
  favorite: string[]
  id: string
  profileImage: string
  userid: string
  userName: string
}

export type ProfileParams = Pick<GetUser, 'profileImage' | 'id' | 'userName' | 'bio' | 'favorite'>

4. Extract

Extractは、ユニオン型から該当する型のみを抽出するユーティリティ型です。

type Status = "success" | "error" | "loading"
type SuccessOrError = Extract<Status, "success" | "error"> // "success" | "error"

また、具体的な型を抽出することも可能です。

type Data = string | number | boolean
type OnlyStringOrNumber = Extract<Data, string | number> // string | number

ユニオン型から取り出す場合はExtractを使い分けましょう。

5. Awaited<T>

Awaited<T> は、TypeScript4.5で導入された、型Promise<T> の中のTを取り出すためのユーティリティ型です。

type FetchData = Promise<string>
type ResolvedData = Awaited<FetchData> // string

また、非同期関数の戻り値から型を取得するのにも便利です。

async function fetchData() {
  return { id: 1, name: "田中" }
}
type DataType = Awaited<ReturnType<typeof fetchData>>
// { id: number, name: string }

ぜひさまざまな型があるので使ってみて下さい。

Discussion

ログインするとコメントできます