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