首页 > 其他分享 >Typescript类型体操 - PercentageParser

Typescript类型体操 - PercentageParser

时间:2022-09-19 01:12:16浏览次数:105  
标签:Typescript PercentageParser extends 体操 expected type infer 85

题目

中文

实现类型 PercentageParser。根据规则 /^(\+|\-)?(\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", ""]

English

Implement PercentageParser.
According to the /^(\+|\-)?(\d*)?(\%)?$/ regularity to match T and get three matches.

The structure should be: [plus or minus, number, unit]
If it is not captured, the default is an empty string.

For example:

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", ""]

答案

解法一(自己琢磨的)

type PercentageParser<A extends string> = A extends `${infer L extends
    | '+'
    | '-'}${infer R}`
    ? [L, PercentageParser<R>[1], PercentageParser<R>[2]]
    : A extends `${infer L extends number}${infer R}`
    ? ['', `${L}${PercentageParser<R>[1]}`, PercentageParser<R>[2]]
    : ['', '', A];

解法二(参考的别的解法, 应该优于解法一)

type PercentageParser<
    A extends string,
    Sign extends '+' | '-' | '' = '',
    Mark extends '' | '%' = ''
> = A extends `${infer L extends '+' | '-'}${infer R}`
    ? PercentageParser<R, L>
    : A extends `${infer L}%`
    ? PercentageParser<L, Sign, '%'>
    : [Sign, A, Mark];

在线演示

标签:Typescript,PercentageParser,extends,体操,expected,type,infer,85
From: https://www.cnblogs.com/laggage/p/type-challenge-percentage-parser.html

相关文章

  • Typescript类型体操 - DropChar
    题目中文从字符串中剔除指定字符。例如:typeButterfly=DropChar<'butterfly!',''>;//'butterfly!'EnglishDropaspecifiedcharfromastring.......
  • Typescript类型体操 - ReplaceKeys
    题目中文实现一个ReplaceKeys类型,这个类型可以替换联合类型中指定属性的类型,如果联合类型中的某个类型没有这个属性,那就跳过;ReplaceKeys接受3个泛型参数.例如......
  • 在 TypeScript 中指定 event.target 的类型
    在TypeScript中指定event.target的类型让我们解决使用ClassList和dataset等属性时出现的错误!案件由来本文出现的所有错误都是基于eslint产生的错误。我想通过......
  • [Typescript] 18. Medium - Deep Readonly
    Implementageneric DeepReadonly<T> whichmakeeveryparameterofanobject-anditssub-objectsrecursively-readonly.Youcanassumethatweareonlydea......
  • [Typescript] 17. Medium - Readonly 2
    Implementageneric MyReadonly2<T,K> whichtakestwotypeargument T and K.K specifythesetofpropertiesof T thatshouldsettoReadonly.When K......
  • Typescript类型体操 - kebab case
    题目中文将camelCase或PascalCase的字符串转换为kebab-case的风格示例:typeFooBarBaz=KebabCase<'FooBarBaz'>;constfoobarbaz:FooBarBaz='foo-bar-baz'......
  • Typescript类型体操 - String to Union
    题目中文实现一个将接收到的String参数转换为一个字母Union的类型。例如typeTest='123';typeResult=StringToUnion<Test>;//expectedtobe"1"|"2"|......
  • Typescript类型体操 - Absolute
    题目中文实现一个接收string,number或bigInt类型参数的Absolute类型,返回一个正数字符串。例如typeTest=-100;typeResult=Absolute<Test>;//expectedtobe"......
  • Typescript类型体操 - Append to object
    题目中文实现一个为接口添加一个新字段的类型。该类型接收三个参数,返回带有新字段的接口类型。例如:typeTest={id:'1'}typeResult=AppendToObject<Test,'va......
  • Typescript类型体操 - Flatten
    题目中文在这个挑战中,你需要写一个接受数组的类型,并且返回扁平化的数组类型。例如:typeflatten=Flatten<[1,2,[3,4],[[[5]]]]>//[1,2,3,4,5]EnglishIn......