TypeScriptで関数の引数や戻り値から型を取得する

TypeScriptで関数の引数や戻り値から型を取得する

August 28, 2021

関数の引数から型を取得 #

  • Parameters<typeof (function name)>
const greet = (name: string, word: 'Hello' | 'Good Bye') => {
  return `${word}, ${name}!`;
};

type Args = Parameters<typeof greet>; // [name: string, word: "Hello" | "Good Bye"]
type firstArg = Args['0']; // string
type secondArg = Args['1']; //  "Hello" | "Good Bye"

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

  • 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 (function name)> 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 がプロミス風オブジェクトの型です。