Generics to work with tuples in TypeScript
import{IsFinite}from'typescript-tuple'typeFoo=IsFinite<[0,1,2]>// Expect: trueconstfoo:Foo=truetypeBar=IsFinite<[0,1,2, ...number[]]>// Expect: falseconstbar:Bar=falsetypeBaz=IsFinite<[0,1,2],'finite','infinite'>// Expect: 'finite'constbaz:Baz='finite'
import{First}from'typescript-tuple'typeFoo=First<['a','b','c']>// Expect: 'a'constfoo:Foo='a'
import{Last}from'typescript-tuple'typeFoo=Last<['a','b','c']>// Expect: 'c'constfoo:Foo='c'
import{Tail}from'typescript-tuple'typeFoo=Tail<['a','b','c']>// Expect: ['b', 'c']constfoo:Foo=['b','c']
import{Append}from'typescript-tuple'typeFoo=Append<['a','b','c'],'x'>// Expect: ['a', 'b', 'c', 'x']constfoo:Foo=['a','b','c','x']
import{Prepend}from'typescript-tuple'typeFoo=Prepend<['a','b','c'],'x'>// Expect: ['x', 'a', 'b', 'c']constfoo:Foo=['x','a','b','c']
import{Reverse}from'typescript-tuple'typeFoo=Reverse<['a','b','c']>// Expect: ['c', 'b', 'a']constfoo:Foo=['c','b','a']
import{Concat}from'typescript-tuple'typeFoo=Concat<['a','b','c'],[0,1,2]>// Expect ['a', 'b', 'c', 0, 1, 2]constfoo:Foo=['a','b','c',0,1,2]
import{Repeat}from'typescript-tuple'// BasictypeFoo=Repeat<'x',5>// Expect ['x', 'x', 'x', 'x', 'x']constfoo:Foo=['x','x','x','x','x']// Using uniontypeBar=Repeat<'x',1|3|4>// Expect ['x'] | ['x', 'x', 'x'] | ['x', 'x', 'x', 'x']constbar1:Bar=['x']constbar3:Bar=['x','x','x']constbar4:Bar=['x','x','x','x']// Using ambiguous 'number' typetypeBaz=Repeat<'x',number>// Expect 'x'[]constbaz:Baz=Array<number>()
NOTES:
- Due to TypeScript design limitations, using floating point numbers and negative numbers might lead to infinite loop within TSC compiler, avoid doing this.
import{ConcatMultiple}from'typescript-tuple'typeFoo=ConcatMultiple<[[],['a'],['b','c']]>// Expect ['a', 'b', 'c']constfoo:Foo=['a','b','c']
import{Drop}from'typescript-tuple'typeFoo=Drop<[0,1,2,3,4],2>// Expect [2, 3, 4]constfoo:Foo=[2,3,4]typeBar=Drop<[0,1,2,3,4, ...number[]],2>// Expect [2, 3, 4, ...number[]]constbar:Bar=[2,3,4]typeBaz=Drop<[0,1,2,3,4],10>// Expect []constbaz:Baz=[2,3,4]typeQux=Drop<[0,1,2,3,4, ...number[]],10>// Expect number[]constqux:Qux=[2,3,4]
import{SliceStartQuantity}from'typescript-tuple'typeFoo=SliceStartQuantity<[0,1,2,3,4,5,6,7,8,9],2,4>// Expect [2, 3, 4, 5]constfoo:Foo=[2,3,4,5]
import{FillTuple}from'typescript-tuple'typeFoo=FillTuple<[0,1,2,3],'r'>constfoo:Foo=['r','r','r','r']
import{CompareLength}from'typescript-tuple'typeFoo=CompareLength<[0,1,2],['a','b','c']>// Expect: 'equal'constfoo:Foo='equal'typeBar=CompareLength<[0,1],['a','b','c','d']>// Expect: 'shorterLeft'constbar:Bar='shorterLeft'typeBaz=CompareLength<[0,1,2,3],['a','b']>// Expect: 'shorterRight'constbaz:Baz='shorterRight'
import{SortTwoTuple}from'typescript-tuple'typeFoo=SortTwoTuple<[0,1],['a','b','c','d']>// Expect: [[0, 1], ['a', 'b', 'c', 'd']]constfoo:Foo=[[0,1],['a','b','c','d']]typeBar=SortTwoTuple<[0,1,2,3],['a','b']>// Expect: [['a', 'b'], [0, 1, 2, 3]]constbar:Bar=[['a','b'],[0,1,2,3]]typeBaz=SortTwoTuple<[0,1,2],['a','b','c','d']>// Expect: [[0, 1, 2], ['a', 'b', 'c']]constbaz:Baz=[[0,1],3,['a','b','c']]typeQux=SortTwoTuple<[0,1,2],['a','b','c','d'],'EQUAL'>// Expect: 'EQUAL'constqux:Qux='EQUAL'
import{ShortestTuple}from'typescript-tuple'typeFoo=ShortestTuple<[[0,1,2],[false,true],['a','b','c','d']]>// Expect: [false, true]constfoo:Foo=[false,true]typeBar=ShortestTuple<[[0,1,2],['a','b','c'], ...[false,true][]]>// Expect: [false, true]constbar:Bar=[false,true]
import{LongestTuple}from'typescript-tuple'typeFoo=LongestTuple<[[0,1,2,3],[false,true],['a']]>// Expect: [0, 1, 2, 3]constfoo:Foo=[0,1,2,3]typeBar=LongestTuple<[[],[false,true], ...[0,1,2][]]>// Expect: [0, 1, 2]constbar:Bar=[0,1,2]
import{FilterTuple}from'typescript-tuple'typeFoo=FilterTuple<[1,'1'],number>// Expect: [1]constfoo:Foo=[1]typeBar=FilterTuple<[1,'1',null,true],1|'1'|true>// Expect: [1, '1', true]constbar:Bar=[1,'1',true]
MIT @Hoàng Văn Khải