From db81191cd2b4eb786914a4f2618620caeae8b009 Mon Sep 17 00:00:00 2001 From: David Luzar Date: Mon, 26 Dec 2022 00:03:06 +0100 Subject: [PATCH] `Join`: Support const tuple values (#533) --- source/join.d.ts | 4 ++-- test-d/join.ts | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/source/join.d.ts b/source/join.d.ts index 5586b7ed5..df9d39435 100644 --- a/source/join.d.ts +++ b/source/join.d.ts @@ -21,13 +21,13 @@ const path: Join<[1, 2, 3], '.'> = [1, 2, 3].join('.'); @category Template literal */ export type Join< - Strings extends Array, + Strings extends Readonly>, Delimiter extends string, > = Strings extends [] ? '' : Strings extends [string | number] ? `${Strings[0]}` - : Strings extends [ + : Strings extends readonly [ string | number, ...infer Rest extends Array, ] diff --git a/test-d/join.ts b/test-d/join.ts index f50477e35..5191e15ad 100644 --- a/test-d/join.ts +++ b/test-d/join.ts @@ -21,3 +21,14 @@ expectNotAssignable<'foo.bar.baz'>(emptyDelimiter); const emptyInput: Join<[], '.'> = ''; expectType<''>(emptyInput); expectNotAssignable<'foo'>(emptyInput); + +// Typeof of const tuple +const tuple = ['foo', 'bar', 'baz'] as const; +const joinedTuple: Join = 'foo,bar,baz'; +expectType<'foo,bar,baz'>(joinedTuple); + +// Typeof of string[] +const stringArray = ['foo', 'bar', 'baz']; +const joinedStringArray: Join = ''; +expectType(joinedStringArray); +expectNotAssignable<'foo,bar,baz'>(joinedStringArray);