かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

TypeScript interface, type のプロパティをキーにしたオブジェクトの型をつくりたい

フォームのエラーを作っていて、schema からエラー用のオブジェクトの型を作りたかった。

例えば

interface UserInterface {
  'name': string;
  'age': number;
  'image'?: string;
}

こんな interface や type から下記のようなエラー用のオブジェクトの型を作りたい。

type ErrorType = {
  'name?': string;
  'age?': string;
  'image?': string;
}

schema になる interface は変わるかも知れないので {[key]: string} で定義したい

key in keyof interface を使えばOK

keyof interface で interface, type の key (プロパティ) の集合が取れる。
それが key in keys なので key の集合の中に含まれる値となる。
なので、先のエラー用のオブジェクトの型は次のように定義すればOK

type ErrorType = {
  [key in keyof UserInterface]: string;
}
/* => 
  type ErrorType = {
    'name': string;
    'age': string;
    'image?': string;
  }
/*

必ずしもエラーがあるわけではないので、プロパティを省略可能にする
interface を Partial にすればOK

type ErrorType = {
  [key in keyof Partial<UserInterface>]: string;
}
/* => 
  type ErrorType = {
    'name?': string;
    'age?': string;
    'image?': string;
  }
/*

₍ ᐢ. ̫ .ᐢ ₎ できた

TypeScript ちょっとずつ解ってる感がある今日このごろです。


[参考]

アタシ☆再生産