awesome-typescript icon indicating copy to clipboard operation
awesome-typescript copied to clipboard

「重学TS 2.0 」TS 练习题第十题

Open semlinker opened this issue 4 years ago • 13 comments

第十题

实现一个 Trim 工具类型,用于对字符串字面量类型进行去空格处理。具体的使用示例如下所示:

type Trim<V extends string> = // 你的实现代码

// 测试用例
Trim<' semlinker '>
//=> 'semlinker'

提示:可以考虑先定义 TrimLeft 和 TrimRight 工具类型,再组合成 Trim 工具类型。 请在下面评论你的答案。

semlinker avatar Sep 14 '21 15:09 semlinker

type TrimLeft<V extends string> = V extends ` ${infer R}` ? TrimLeft<R> : V;
type TrimRight<V extends string> = V extends `${infer R} ` ? TrimRight<R> : V;

type Trim<V extends string> = TrimLeft<TrimRight<V>>;

// 测试用例
Trim<' semlinker '>
//=> 'semlinker'

semlinker avatar Sep 16 '21 01:09 semlinker

type TrimLeft<V extends string> = V extends ` ${infer U}` ? TrimLeft<U> : V
type TrimRight<V extends string> = V extends `${infer U} ` ? TrimRight<U> : V

type Trim<V extends string> = TrimLeft<TrimRight<V>>

// 测试用例
type Result = Trim<' semlinker '>
//=> 'semlinker'

Mrlgm avatar Sep 27 '21 12:09 Mrlgm

// 实现一个 Trim 工具类型,用于对字符串字面量类型进行去空格处理。具体的使用示例如下所示:
type TrimLeft<T extends string> = T extends ` ${infer A}` ? TrimLeft<A> : T;
type TrimRight<T extends string> = T extends `${infer A} ` ? TrimRight<A> : T;

type Trim<V extends string> = TrimLeft<TrimRight<V>>;

// 测试用例
type T1 = Trim<' semlinker '>
type T2 = Trim<' semlinker              '>
type T3 = Trim<'             semlinker              '>
//=> 'semlinker'

这题需要掌握的是 extends 配合 infer 在字符串中的使用,之后就是映射类型可以递归。 另外注意Trim分解成TrimLeft 和 TrimRight是分治的思想。分而治之,有效的简化了问题

zhaoxiongfei avatar Oct 01 '21 15:10 zhaoxiongfei

type TrimLeft<V extends string> = V extends ` ${infer C}` ? TrimLeft<C> : V; type TrimRight<V extends string> = V extends `${infer C} ` ? TrimRight<C> : V; type Trim<V extends string> = TrimLeft<TrimRight<V>>;

liulise avatar Dec 07 '21 03:12 liulise

// 去除左侧空格
type TrimLeft<V extends string> = V extends ` ${infer R}` ? TrimLeft<R> : V
// 去除右侧空格
type TrimRight<V extends string> = V extends `${infer L} ` ? TrimRight<L> : V
type Trim<V extends string> = TrimRight<TrimLeft<V>>

ShawDuChen avatar Dec 29 '21 03:12 ShawDuChen

好多题目都融合了巧妙的算法啊

smartymoon avatar Jan 14 '22 14:01 smartymoon

type Trim<V extends string> = V extends ` ${infer R}` | `${infer R} ` ? Trim<R> : V
type foo = Trim<'    semlinker    '>

jeffacode avatar Feb 08 '22 15:02 jeffacode

// 测试用例
type R = Trim<' semlinker '>
//=> 'semlinker'

type Trim<V extends string, Str extends string = ''> = 
  V extends `${infer First}${infer Rest}`
    ? First extends ' '
      ? Trim<Rest, Str>
      : Trim<Rest, `${Str}${First}`>
    : Str

waleiwalei avatar Mar 11 '22 08:03 waleiwalei

type TrimL<V extends string> = V extends `${infer P}` ? TrimL<P> : V
type TrimR<V extends string> =  V extends `${infer P}` ? TrimR<P> : V
type Trim<V extends string> = TrimL<TrimR<V>>// 你的实现代码

// 测试用例
Trim<' semlinker '>
//=> 'semlinker'

YJCCreateAHistory avatar May 27 '22 12:05 YJCCreateAHistory

type Trim<V extends string> = V extends ` ${infer R} ` ? R : V; // 你的实现代码

// 测试用例
type R = Trim<' semlinker '>

fishcoderman avatar Aug 25 '22 15:08 fishcoderman

这题妙啊

MuLoo avatar Feb 09 '23 10:02 MuLoo

type Trim<T extends string> = T extends `${infer F}${infer Rest}`
  ? F extends ' '
    ? Trim<Rest>
    : `${F}${Trim<Rest>}`
  : ''
type TTestTrim = Trim<' s em link    er '>
// semlinker

yitjhy avatar Feb 22 '23 10:02 yitjhy

type Trim<V extends string> = V extends ` ${infer S} ` ? Trim<S> : V

SweeperDuan avatar Dec 11 '23 09:12 SweeperDuan