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"