UNPKG

@cuppachino/type-space

Version:

A collection of type utilities for TypeScript.

25 lines (24 loc) 1.16 kB
import type { IgnoreMutability } from './ignore-mutability'; import type { Stringifiable } from './stringifiable'; /** * Joins an array of strings into a single string, separated by a delimiter. * * @example * ``` * Join<['apple', 'banana', 'plum'], ' & '> // 'apple & banana & plum' * ``` * @example * ``` * Join<['a', 'b', 'c']> // 'abc' * ``` */ export type Join<T extends Stringifiable[] | readonly Stringifiable[], D extends Stringifiable = '', Acc extends Stringifiable = ''> = IgnoreMutability<T> extends T ? JoinReadonly<T, D, Acc> : JoinMutable<[...T], D, Acc>; type JoinMutable<T extends Stringifiable[], D extends Stringifiable = '', Acc extends Stringifiable = ''> = T extends [ infer Head extends Stringifiable, ...infer Tail extends Stringifiable[] ] ? Join<Tail, D, `${Acc}${Head}${Tail extends [] ? '' : D}`> : Acc; type JoinReadonly<T extends readonly Stringifiable[], D extends Stringifiable = '', Acc extends Stringifiable = ''> = T extends readonly [ infer Head extends Stringifiable, ...infer Tail extends readonly Stringifiable[] ] ? Join<Tail, D, `${Acc}${Head}${Tail extends [] ? '' : D}`> : Acc; export {};