🤖

TypeScript で、ある型を満たす型を定義する

2024/01/20に公開
2

extends を使う。

例 1:プロパティ name: string を必ず持っているオブジェクトの型を定義する

type RequiredObject<T extends { name: string}> = T

type MyObject = RequiredObject<
  {
    name: string;  // ここが無ければ型エラー
    email: string;
  }
>

例 2:ある型が Error オブジェクト型を継承しているかチェックする

type ShouldBeError<T extends Error> = T;

// MyCustomError 型が Error 型を継承していなければ型エラー
type T = ShouldBeError<MyCustomError>;

などなど。

Discussion

nap5nap5

タイポかもと思いました

type RequiredObject<T extends { name: string }> = T

- type MyObject = RequredObject
+ type MyObject = RequiredObject

また、ぼくもextendsを使ってデモ作ってみました

demo code

type TSuccess = "success"
type TLoading = "loading"
type TPartitalError = "partial-error"
type TError = "error"
type TEmpty = "empty"

type TGenerateFiveState<T extends { name: string }, E extends Error = Error> = {
  type: TSuccess
  data: T
} | {
  type: TLoading
} | {
  type: TPartitalError
} | {
  type: TError
  error: E
} | {
  type: TEmpty
}

interface ThirdPartyError extends Error { }

type ApplicationError = ThirdPartyError

type Fruit = {
  id: string
  name: string // ここが無ければ型エラー
  price: number
}

type FiveState = TGenerateFiveState<Fruit, ApplicationError>

const dataWithStat: FiveState = { type: "success", data: { id: "1", name: "cowboy", price: Infinity } }
CsideCside

ありがとうございます。Typo 直しておきました。