import type { Equal, Expect } from '@type-challenges/utils' type cases = [ Expect, 'a-p-p-l-e'>>, Expect, 'Hello World'>>, Expect, '21212'>>, Expect, 'o'>>, ]; type Stringable = (string | number | bigint | boolean | null | undefined); type JoinInternal< T extends Stringable[], U extends Stringable, Acc extends string > = T extends [infer First, infer Second, ...infer Tail] ? First extends Stringable ? Second extends Stringable ? Tail extends Stringable[] ? JoinInternal<[Second, ...Tail], U, `${Acc}${First}${U}`> : never : never : never : T extends [infer Head, ...infer Tail] ? Head extends Stringable ? `${Acc}${Head}` : never : Acc ; type Join< T extends Stringable[], U extends Stringable, > = JoinInternal