首页 > 其他分享 >[Typescript] 110. Hard - Union to Tuple

[Typescript] 110. Hard - Union to Tuple

时间:2022-11-19 01:00:56浏览次数:40  
标签:Typescript Tuple Union never UnionToTuple union Expect type any

Implement a type, UnionToTuple, that converts a union to a tuple.

As we know, union is an unordered structure, but tuple is an ordered, which implies that we are not supposed to preassume any order will be preserved between terms of one union, when unions are created or transformed.

Hence in this challenge, any permutation of the elements in the output tuple is acceptable.

Your type should resolve to one of the following two types, but NOT a union of them!

UnionToTuple<1>           // [1], and correct
UnionToTuple<'any' | 'a'> // ['any','a'], and correct

or

UnionToTuple<'any' | 'a'> // ['a','any'], and correct

It shouldn't be a union of all acceptable tuples...

UnionToTuple<'any' | 'a'> // ['a','any'] | ['any','a'], which is incorrect

And a union could collapes, which means some types could absorb (or be absorbed by) others and there is no way to prevent this absorption. See the following examples:

Equal<UnionToTuple<any | 'a'>,       UnionToTuple<any>>         // will always be a true
Equal<UnionToTuple<unknown | 'a'>,   UnionToTuple<unknown>>     // will always be a true
Equal<UnionToTuple<never | 'a'>,     UnionToTuple<'a'>>         // will always be a true
Equal<UnionToTuple<'a' | 'a' | 'a'>, UnionToTuple<'a'>>         // will always be a true

 

/* _____________ Your Code Here _____________ */

// 参考:https://github.com/type-challenges/type-challenges/issues/10191

// 1. 将联合类型转换成对应的函数交叉类型 (arg的参数是函数,返回的类型才是交叉类型,其他的都是never)
type UnionToIntersectionFn<U> = (U extends any ? (arg: () => U) => void : never) extends (arg: infer I) => void ? I : never;

// 2. 获取联合类型的最后一个类型
// (() => "a") & (() => "b") & (() => "c")
// 在获取函数的返回值上,函数重载和函数交叉类型是一样的
type GetLastUnion<U> = UnionToIntersectionFn<U> extends () => infer I ? I : never;

// 3. 联合类型转换为元组
type UnionToTuple<U, Last = GetLastUnion<U>> = [U] extends [never] ? [] : [...UnionToTuple<Exclude<U, Last>>, Last];
/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '@type-challenges/utils'

type ExtractValuesOfTuple<T extends any[]> = T[keyof T & number]

type cases = [
  Expect<Equal<UnionToTuple<'a' | 'b'>['length'], 2>>,
  Expect<Equal<ExtractValuesOfTuple<UnionToTuple<'a' | 'b'>>, 'a' | 'b'>>,
  Expect<Equal<ExtractValuesOfTuple<UnionToTuple<'a'>>, 'a'>>,
  Expect<Equal<ExtractValuesOfTuple<UnionToTuple<any>>, any>>,
  Expect<Equal<ExtractValuesOfTuple<UnionToTuple<undefined | void | 1>>, void | 1>>,
  Expect<Equal<ExtractValuesOfTuple<UnionToTuple<any | 1>>, any | 1>>,
  Expect<Equal<ExtractValuesOfTuple<UnionToTuple<any | 1>>, any>>,
  Expect<Equal<ExtractValuesOfTuple<UnionToTuple<'d' | 'f' | 1 | never>>, 'f' | 'd' | 1>>,
  Expect<Equal<ExtractValuesOfTuple<UnionToTuple<[{ a: 1 }] | 1>>, [{ a: 1 }] | 1>>,
  Expect<Equal<ExtractValuesOfTuple<UnionToTuple<never>>, never>>,
  Expect<Equal<ExtractValuesOfTuple<UnionToTuple<'a' | 'b' | 'c' | 1 | 2 | 'd' | 'e' | 'f' | 'g'>>, 'f' | 'e' | 1 | 2 | 'g' | 'c' | 'd' | 'a' | 'b'>>,
]

 

标签:Typescript,Tuple,Union,never,UnionToTuple,union,Expect,type,any
From: https://www.cnblogs.com/Answer1215/p/16905331.html

相关文章

  • TypeScript 函数重载
    TypeScript函数重载发布于2020-03-1717:53:05阅读 3.4K0 一、可爱又可恨的联合类型由于JavaScript是一个动态语言,我们通常会使用不同类型的参数来调用同......
  • TypeScript 4.9 发布,新增 satisfies 操作符
    TypeScript4.9发布,新增satisfies操作符来源:OSCHINA编辑: 罗奇奇2022-11-1707:04:50 1TypeScript4.9已正式发布,此版本引入了多项新功能。此版本......
  • [Typescript] noImplicitOverride
    Let'ssayyouextendsfromabaseclass,youintenttooverrideamethodinbaseclassclassBaseCmp{showCmp(){}hideCmp(){}helperMethod(){}}cla......
  • 【草稿】在 Typescript 中从对象中动态解构接口类型
    问题interfaceA{title:string,description:string,}leta={title:"titlea",description:"descriptiona",url:"http://example.com/a"}是......
  • React中常见的TypeScript定义实战
    一引沿Fiber架构是React16中引入的新概念,目的就是解决大型React应用卡顿,React在遍历更新每一个节点的时候都不是用的真实DOM,都是采用虚拟DOM,所以可以理解成fiber就是R......
  • React-hooks+TypeScript最佳实战
    ReactHooks什么是HooksReact一直都提倡使用函数组件,但是有时候需要使用state或者其他一些功能时,只能使用类组件,因为函数组件没有实例,没有生命周期函数,只有类组件才......
  • 自学 TypeScript 第三天 使用webpack打包 TS 代码
    前言:大家好啊,昨天介绍了TS编译器的配置,但在我们实际开发当中直接使用TS编译器去编译代码的情况会有,但没有很多,因为我们在开发大型项目的时候,一般我们都会用到打包工具......
  • 这10个TypeScript高级技巧,助你成为更好的开发者!
    在使用了一段时间的Typescript之后,我深深地感受到了Typescript在大中型项目中的必要性。可以提前避免很多编译期的bug,比如烦人的拼写问题。并且越来越多的包都在使用TS,所以......
  • 40:元组_特点_创建的两种方式_tuple()要点
    ###元组tuple列表属于可变序列,可以任意修改列表中的元素。元组属于不可变序列,不能修改元组中的元素。因此,元组没有增加元素、修改元素、删除元素相关的方法。因此,我们只......
  • [Typescript] Variable assignment - extends infer X
    Youcanuse`extendsinferX`toassigntheresultofanexpressiontoavariabletypeSomeFunction<U>=SuperHeavyComputation<U>extendsinferResult......