type Unpacked‹T› =
    T extends (infer U)[] ? U :
    T extends (...args: any[]) =› infer U ? U :
    T extends Promise‹infer U› ? U :
    T;

type T0 = Unpacked‹string›;  // string
type T1 = Unpacked‹string[]›;  // string
type T2 = Unpacked‹() =› string›;  // string
type T3 = Unpacked‹Promise‹string››;  // string
type T4 = Unpacked‹Promise‹string›[]›;  // Promise‹string›
type T5 = Unpacked‹Unpacked‹Promise‹string›[]››;  // string