export namespace Infer {
export type ElementType<T> = T extends unknown[] ? T[number] : T;
export type InferElementType<T> = T extends (infer U)[] ? U : T;
export type SecondArg<F> = F extends (a:any,b:infer B) => any ? B : never;
}
type ElementTest = Infer.ElementType<number[]>; // number;
type InferElementTest = Infer.InferElementType<string[]> // string;
type InferElementTest1 = Infer.InferElementType<string> // string;
type F = typeof Array['prototype']['slice']; // type F = (start?: number | undefined, end?: number | undefined) => any[]
type SecondArg = Infer.SecondArg<F>; // type SecondArg = number | undefined
infer는 generic으로 받은 type을 tsc가 추론하여 스스로 결정하게 된다.
type SecondArg는 전달받은 F의 타입을 추론해 해당 인자의 타입을 끌어내어 반환해주고 있다. 이를 infer가 아닌 방법으로 어떻게 하면 끌어낼 수 있을지 두렵다