首页 > 其他分享 >[Typescript] 131. Extreme - Query String Parser

[Typescript] 131. Extreme - Query String Parser

时间:2022-12-08 22:36:23浏览次数:59  
标签:Typescript String true Parser k1 extends Expect key type

You're required to implement a type-level parser to parse URL query string into a object literal type.

Some detailed requirements:

  • Value of a key in query string can be ignored but still be parsed to true. For example, 'key' is without value, so the parser result is { key: true }.
  • Duplicated keys must be merged into one. If there are different values with the same key, values must be merged into a tuple type.
  • When a key has only one value, that value can't be wrapped into a tuple type.
  • If values with the same key appear more than once, it must be treated as once. For example, key=value&key=value must be treated as key=value only.
/* _____________ Your Code Here _____________ */

type ToKeyValPair<T extends string> = T extends `${infer K extends string}=${infer V}` ? {[Key in K]: V}: {[Key in T]: true};
type MapToKeyValPair<T extends string[]> = T extends [infer F extends string, ...infer RT extends string[]] ? [ToKeyValPair<F>, ...MapToKeyValPair<RT>]: [];
type SplitQuery<T extends string> = T extends `${infer Q}&${infer RT}` ? [Q, ...SplitQuery<RT>]: [T];
type MergeObject<T> = {
  [P in keyof T]: T[P]
} 
type Grouping<U, ACC extends Record<PropertyKey, unknown>= {}> = U extends object[] 
  ? U extends [infer F, ...infer RT] 
    ? Grouping<RT, MergeObject<({
      [Key in keyof ACC as Key extends keyof F ? never: Key]: ACC[Key]
    } & {
      [Key in keyof F]: Key extends keyof ACC 
        ? ACC[Key] extends any[] 
          ? [...ACC[Key], F[Key]]
          : Equal<F[Key], ACC[Key]> extends true ? F[Key]: [ACC[Key], F[Key]]
        : F[Key]
    })>>
    : ACC
  :ACC
type ParseQueryString<T extends string> = T extends '' ? {}: Grouping<MapToKeyValPair<SplitQuery<T>>>

/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '@type-challenges/utils'

type cases = [
  Expect<Equal<ParseQueryString<''>, {}>>,
  Expect<Equal<ParseQueryString<'k1'>, { k1: true }>>,
  Expect<Equal<ParseQueryString<'k1&k1'>, { k1: true }>>,
  Expect<Equal<ParseQueryString<'k1&k2'>, { k1: true; k2: true }>>,
  Expect<Equal<ParseQueryString<'k1=v1'>, { k1: 'v1' }>>,
  Expect<Equal<ParseQueryString<'k1=v1&k1=v2'>, { k1: ['v1', 'v2'] }>>,
  Expect<Equal<ParseQueryString<'k1=v1&k2=v2'>, { k1: 'v1'; k2: 'v2' }>>,
  Expect<Equal<ParseQueryString<'k1=v1&k2=v2&k1=v2'>, { k1: ['v1', 'v2']; k2: 'v2' }>>,
  Expect<Equal<ParseQueryString<'k1=v1&k2'>, { k1: 'v1'; k2: true }>>,
  Expect<Equal<ParseQueryString<'k1=v1&k1=v1'>, { k1: 'v1' }>>,
  Expect<Equal<ParseQueryString<'k1=v1&k2=v2&k1=v2&k1=v3'>, { k1: ['v1', 'v2', 'v3']; k2: 'v2' }>>,
]

 

标签:Typescript,String,true,Parser,k1,extends,Expect,key,type
From: https://www.cnblogs.com/Answer1215/p/16967580.html

相关文章

  • Strings must be encoded before hashing
    Stringsmustbeencodedbeforehashing当我们将字符串传递给hash算法时,会出现“TypeError:Stringsmustbeencodedbeforehashing”。解决错误,使用encode()impo......
  • 443.string-compression 压缩字符串
    问题描述443.压缩字符串解题思路双指针、滑动窗口,注意for循环中不需要fast++。代码classSolution{public:intcompress(vector<char>&chars){vect......
  • Java中String类型判空
    根据之前的学习,我们已经知道在Java中String类型是不可以通过==直接判等的,而应该通过equals()那么在Java中String类型要如何判空呢? 在最开始,我以为判空是这样进行的——......
  • toString转化成Json或实体对象
    废话不多说,代码上一波!!! 实体中生成的toSting转json格式或者转实体类格式packagecom.xxx.util;importcom.alibaba.fastjson.JSON;importjavafx.util.Pair;importo......
  • TypeScript 开发环境搭建
    OverridetheentrypointofanimageIntroducedinGitLabandGitLabRunner9.4.Readmoreaboutthe extendedconfigurationoptions.Beforeexplainingtheav......
  • 一. TypeScript基础
    1.TS运行环境方式一:通过webpack,配置本地的TypeScript编译环境和开启一个本地服务,可以直接运行在浏览器上方式二:通过ts-node库,为TypeScript的运行提供执行环境安装ts......
  • 7、StringBuffer与日期相关类
    StringBuffer类1、 String类的内容一旦声明就不可以改变,如果改变其实是换了一个String对象,如果要改变字符串内容怎么办,可以使用StringBuffer类2、 因为String类改变是通......
  • string字符串扩展
    ///<summary>//////</summary>publicstaticclassStringExtentions{///<summary>///转换为MD5加密后的字符串(默认加密为32......
  • [Typescript] 130. Hard - Replace Union
    Givenan unionoftypes and arrayoftypepairs toreplace([[string,number],[Date,null]]),returnanewunionreplacedwiththe typepairs. /*____......
  • Java难点 | StringBuilder类/StringBuffer类
    StringBuilder类/StringBuffer类stringBuffer/strinaBuilder可以看做可变长度字符串。stringBuffer/stringBuilder初始化容量16.stringBuffer/stringBuilder是完成字符......