type TypeName‹T› =
T extends string ? "string" :
T extends number ? "number" :
T extends boolean ? "boolean" :
T extends undefined ? "undefined" :
T extends Function ? "function" :
"object";
type T0 = TypeName‹string›; // "string"
type T1 = TypeName‹"a"›; // "string"
type T2 = TypeName‹true›; // "boolean"
type T3 = TypeName‹() => void›; // "function"
type T4 = TypeName‹string[]›; // "object"