You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
35 lines
941 B
35 lines
941 B
import type { Equal, Expect } from '@type-challenges/utils'
|
|
|
|
type cases = [
|
|
Expect<Equal<Join<['a', 'p', 'p', 'l', 'e'], '-'>, 'a-p-p-l-e'>>,
|
|
Expect<Equal<Join<['Hello', 'World'], ' '>, 'Hello World'>>,
|
|
Expect<Equal<Join<['2', '2', '2'], 1>, '21212'>>,
|
|
Expect<Equal<Join<['o'], 'u'>, '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<T, U, ''> |