Percentage Parser
题目
实现类型 PercentageParser<T extends string>
。根据规则 /^(\+|\-)?(\d*)?(\%)?$/
匹配类型 T。
匹配的结果由三部分组成,分别是:[正负号
, 数字
, 单位
],如果没有匹配,则默认是空字符串。
例如:
ts
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", ""]
解答
通过 infer
解构推导是否为空字符串:
ts
A extends `${infer First}${infer Rest}`
若为空字符串,则直接返回 ["", "", ""]
。
继续推导 First
是否是联合类型 "+" | "-"
,若不是则返回 [""]
。
Rest
是否是模板字符 ${infer S}%
,若不是则返回 [""]
。
ts
type PercentageParser<A extends string> =
A extends `${infer First}${infer Rest}`
? First extends "+" | "-"
? Rest extends `${infer S}%`
? [First, S, "%"]
: [First, Rest, ""]
: A extends `${infer S}%`
? ["", S, "%"]
: ["", A, ""]
: ["", "", ""];