You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// helpers...typeObj<T>={[k: string]: T};typeSafeObj<Oextends{[k: string]: any},Nameextendsstring,Paramextendsstring>=O&Obj<{[KinName]: Param}>;typeSwitchObj<Paramextendsstring,Nameextendsstring,OextendsObj<any>>=SafeObj<O,Name,Param>[Param];typeNot<Textendsstring>=SwitchObj<T,'InvalidNotParam',{'1': '0';'0': '1';}>;typeUnionHas<Unionextendsstring,Kextendsstring>=({[SinUnion]: '1'}&{[k: string]: '0'})[K];typeObj2Keys<T>={[KinkeyofT]: K}&{[k: string]: undefined};// data...typeItem1={a: string,b: number,c: boolean};// okay, Omit, let's go.typeOmit_<Textends{[s: string]: any},KextendskeyofT>={[P2inkeyofT]: {1: Obj2Keys<T>[P2],0: undefined}[Not<UnionHas<K,P2>>]}typeT1=Omit_<Item1,"a">;// intermediary result: { a: undefined; b: "b"; c: "c"; }typeT2={[P1inT1[keyofItem1]]: Item1[P1]};// { b: number, c: boolean };// ^ great, the result we want!// now let's combine the steps?!typeOmit<Textends{[s: string]: any},KextendskeyofT>={[P1in{[P2inkeyofT]: {1: Obj2Keys<T>[P2],0: undefined}[Not<UnionHas<K,P2>>]}[keyofT]]: T[P1]};typeT3=Omit<Item1,"a">;// ^ yields { a: string, b: number, c: boolean }, not { b: number, c: boolean }// uh, could we instead do the next step in a separate wrapper type?:typeOmit2<Textends{[s: string]: any},KextendskeyofT>=Omit_<T,K>[keyofT];// ^ not complete yet, but this is the minimum repro of the part that's going wrongtypeT4=Omit2<Item1,"a">;// ^ nope, foiled again! 'a'|'b'|'c' instead of 'b'|'c'... wth? // fails unless this access step is done after the result is calculated, dunno why
Here's another occurrence that doesn't appears solved with those defaults:
exporttypeObj<T>={[k: string]: T};exporttypeTupleHasIndex<Arrextendsany[],Iextendsnumber>=({[KinkeyofArr]: '1'}&Array<'0'>)[I];// ^ #15768, TS2536 `X cannot be used to index Y` on generictypeObjectHasKey<Oextends{},Kextendsstring>=({[KinkeyofO]: '1'}&Obj<'0'>)[K];typeNumberToString=['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','36','37','38','39','40','41','42','43','44','45','46','47','48','49','50','51','52','53','54','55','56','57','58','59','60','61','62','63','64','65','66','67','68','69','70','71','72','73','74','75','76','77','78','79','80','81','82','83','84','85','86','87','88','89','90','91','92','93','94','95','96','97','98','99','100','101','102','103','104','105','106','107','108','109','110','111','112','113','114','115','116','117','118','119','120','121','122','123','124','125','126','127','128','129','130','131','132','133','134','135','136','137','138','139','140','141','142','143','144','145','146','147','148','149','150','151','152','153','154','155','156','157','158','159','160','161','162','163','164','165','166','167','168','169','170','171','172','173','174','175','176','177','178','179','180','181','182','183','184','185','186','187','188','189','190','191','192','193','194','195','196','197','198','199','200','201','202','203','204','205','206','207','208','209','210','211','212','213','214','215','216','217','218','219','220','221','222','223','224','225','226','227','228','229','230','231','232','233','234','235','236','237','238','239','240','241','242','243','244','245','246','247','248','249','250','251','252','253','254','255'];typeInc=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256];typeOverwrite<K,T>={[PinkeyofT|keyofK]: {1: T[P],0: K[P]}[ObjectHasKey<T,P>]};typeTupleToObject<Rextendsany[],Iextendsnumber=0,Acc={}>={1: TupleToObject<R,Inc[I],Overwrite<Acc,{[PinNumberToString[I]]: R[I]}>>,0: Acc}[TupleHasIndex<R,I>];typeTestArr=['a','b','c'];typeArr2ObjTest=TupleToObject<TestArr>;// { 0: "a"; 1: "b"; 2: "c"; }typekeys=keyofArr2ObjTest// "0" | "1" | "2"// type TupleIndicesToUnion<R extends any[]> = keyof TupleToObject<R>;typeTupleIndicesToUnion<Rextendsany[],OextendsTupleToObject<R,0>=TupleToObject<R,0>>=keyofO;// ^ split into steps using defaults following @niirendy in #12215, same resulttypeArrKeys2UnionTest=TupleIndicesToUnion<TestArr>;// ^ expected to equal `keys`, but gives `never` (O yield `{}`)
Worked around this one by typing the last one differently altogether, making the root cause less urgent again. I'll re-close until a new blocker comes in I guess.
Activity
KiaraGrouwstra commentedon Jun 11, 2017
Fixed by nir (@nirendy) at #12215. 😃
KiaraGrouwstra commentedon Jun 29, 2017
Here's another occurrence that doesn't appears solved with those defaults:
KiaraGrouwstra commentedon Jun 30, 2017
Worked around this one by typing the last one differently altogether, making the root cause less urgent again. I'll re-close until a new blocker comes in I guess.