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