関数の戻り値から型を取得

  • ReturnType<typeof (function name)>
const getUser = () => ({
  name: 'Alice',
  age: 20,
  sex: 'female',
  hasPhone: true,
  friends: ['Bob', 'Charlie', 'David'],
  school: {
    name: 'Awesome University',
    major: 'cs',
  },
});

type User = ReturnType<typeof getUser>;

// {
//   name: string;
//   age: number;
//   sex: string;
//   hasPhone: boolean;
//   friends: string[];
//   school: {
//     name: string;
//     major: string;
// };

関数の戻り値から型を取得(非同期関数)

  • ReturnType<typeof (function name)> extends Promise<infer T> ? T : never
  • ReturnType<typeof Auth.getStatus> extends PromiseLike<infer T> ? T : never
const getUser = async () => ({
  name: 'Alice',
  age: 20,
  sex: 'female',
  hasPhone: true,
  friends: ['Bob', 'Charlie', 'David'],
  school: {
    name: 'Awesome University',
    major: 'cs',
  },
});

type User = ReturnType<typeof getUser> extends Promise<infer T> ? T : never;

// {
//   name: string;
//   age: number;
//   sex: string;
//   hasPhone: boolean;
//   friends: string[];
//   school: {
//     name: string;
//     major: string;
// };

補足

正確には Promise オブジェクトではないが “then” メソッドを持っているオブジェクト(thenable なオブジェクトと呼ばれます)は、プロミス風オブジェクトと呼ばれます。TypeScript では、PromiseLike がプロミス風オブジェクトの型です。