parent
7bb961c548
commit
e4a2801c98
@ -0,0 +1,35 @@
|
||||
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, ''>
|
||||
Loading…
Reference in new issue