@cuppachino/type-space
Version:
A collection of type utilities for TypeScript.
25 lines (24 loc) • 1.16 kB
TypeScript
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 {};