関数の引数から型を取得 #
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 がプロミス風オブジェクトの型です。