awesome-typescript
awesome-typescript copied to clipboard
「重学TS 2.0 」TS 练习题第十题
第十题
实现一个 Trim 工具类型,用于对字符串字面量类型进行去空格处理。具体的使用示例如下所示:
type Trim<V extends string> = // 你的实现代码
// 测试用例
Trim<' semlinker '>
//=> 'semlinker'
提示:可以考虑先定义 TrimLeft 和 TrimRight 工具类型,再组合成 Trim 工具类型。 请在下面评论你的答案。
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'
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'
// 实现一个 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是分治的思想。分而治之,有效的简化了问题
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>>;
// 去除左侧空格
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>>
好多题目都融合了巧妙的算法啊
type Trim<V extends string> = V extends ` ${infer R}` | `${infer R} ` ? Trim<R> : V
type foo = Trim<' semlinker '>
// 测试用例
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
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'
type Trim<V extends string> = V extends ` ${infer R} ` ? R : V; // 你的实现代码
// 测试用例
type R = Trim<' semlinker '>
这题妙啊
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
type Trim<V extends string> = V extends ` ${infer S} ` ? Trim<S> : V