# 1978-百分比解析器
# 题目描述
实现类型 PercentageParser<T extends string>
。根据规则 /^(\+|\-)?(\d*)?(\%)?$/
匹配类型 T。
匹配的结果由三部分组成,分别是:[`正负号`, `数字`, `单位`]
,如果没有匹配,则默认是空字符串。
例如:
type PString1 = '';
type PString2 = '+85%';
type PString3 = '-85%';
type PString4 = '85%';
type PString5 = '85';
type R1 = PercentageParser<PString1>; // expected ['', '', '']
type R2 = PercentageParser<PString2>; // expected ["+", "85", "%"]
type R3 = PercentageParser<PString3>; // expected ["-", "85", "%"]
type R4 = PercentageParser<PString4>; // expected ["", "85", "%"]
type R5 = PercentageParser<PString5>; // expected ["", "85", ""]
# 分析
这个题目本质还是利用字符的匹配推断即可解决,由于输出结果固定为 3 个元素,那么可以直接拆成 3 次匹配,分别匹配符号、内容和 % 号即可。
# 题解
type P1<T extends string> = T extends `${infer F extends '+' | '-'}${infer R}`
? F
: '';
type P2<T extends string> = T extends `${infer F extends '+' | '-'}${infer M}%`
? M
: T extends `${infer F extends '+' | '-'}${infer M}`
? M
: T extends `${infer M}%`
? M
: T;
type P3<T extends string> = T extends `${string}%` ? '%' : '';
type PercentageParser<T extends string> = [P1<T>, P2<T>, P3<T>];
可以看出来,符号和 % 号很容易判别,但是中间内容区域,确实判定起来比较麻烦,需要判断有无 +-,有无 % 后,才能得到最后的结果
# 知识点
- 字符匹配推断套路。
A extends `${infer F}${infer R}%`