# 5310-Join

# 题目描述

Implement the type version of Array.join, Join<T, U> takes an Array T, string or number U and returns the Array T with U stitching up.

type Res = Join<['a', 'p', 'p', 'l', 'e'], '-'>; // expected to be 'a-p-p-l-e'
type Res1 = Join<['Hello', 'World'], ' '>; // expected to be 'Hello World'
type Res2 = Join<['2', '2', '2'], 1>; // expected to be '21212'
type Res3 = Join<['o'], 'u'>; // expected to be 'o'

# 分析

这题是将元组拼接指定字符后返回新的字符。

遇到这种遍历一次元组即可解决,需要注意的是连接符增加的边界条件,只要不是最后一个元素,则可以直接在后方添加连接符,此时就需要判断是否是最后一个元素。

比较麻烦的判断是否是最后一个元素可以通过辅助元组计数即可判断。

更简单的方法是利用 元组推断的边界条件。

// Case1 = []
type Case1 = [1] extends [infer F, ...infer R] ? R : false;

当元组遍历到最后一个元素时,此时 R 是 [],可以根据 R 是否是 [] 来断定此时推断的 F 是否是最后一个元素。

# 题解

type Join<T extends string[], U extends string | number> = T extends [
  infer F extends string,
  ...infer R extends string[],
]
  ? // 简单判断最后一个元素
    R extends []
    ? `${F}`
    : `${F}${U}${Join<R, U>}`
  : '';

对于 infer F extends string, ...infer R extends string[] 中为什么需要指定 extends string 有疑问的同学可以去掉试试,此时 ts 会报错,具体原因是因为后面的 ${F} 要求 F 必须是 string or number 类型。

# 知识点

  1. 元组遍历套路
  2. 判断元组的最后一个元素的思路
Last Updated: 2023/5/16 06:00:28