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

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

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

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