TypeScript Version: 4.0.0-beta (same behaviour in version 3.5.1 v3.5.1-Play Ground)
Search Terms:
"key in keyof Array", "keyof Array"
Expected behavior:
using key in ArrayType has the same behaviour as on any object (returning an array type only if the relevant properties are unchanged)
Actual behavior:
using key in ArrayType performs actions on touple entries but the returned type allways includes all default Array properties
Extention note:
Not the point of this issue and i know there are other issues around this topic. it's just a note,
but how about possibly adding tupple functionality for ArrayLike-, Map- and Set-types? They have all the basic qualities of a tupple, and it would be awesome to use them in a similar fashion (especially inference of Map.prototype.get/set and [Symbol.iterator] inference of tupples)
Related Issues:
#39726
#34780
type-fest/issues/119(external library, but about this this behaviour and includes adHoc fix)
Code
typeArr=[0,1,2,3,4,5,6,7,8,9]typeArr2=(0|1|2|3|4|5|6|7|8|9)[]typeWhoopMyArray_Faulty<BaseextendsArrayLike<any>,Condition>={[KeyinkeyofBase]:
Base[Key]extendsCondition
? 'Whoop it'
: Base[Key]extendsBase[number] ? Base[Key] : never}// action is performed on array elements but return type is still a proper arraytypeWhoopedArray=WhoopMyArray_Faulty<Arr,7|5|2>typeWhoopedArrayKeys=WhoopMyArray_Faulty<Arr,7|5|2>[keyofArr]// related side note, but not the main pont// no action performed. in line with 1st example, expected: (0 | 1 | 'Whoop it' | 3 | 4 | 'Whoop it' | 6 | 'Whoop it' | 8 | 9)[]typeWhoopedArray2=WhoopMyArray_Faulty<Arr2,7|5|2>typeWhoopedArray2Keys=WhoopMyArray_Faulty<Arr,7|5|2>[keyofArr]infered types:
typeWhoopedArray=[0,1,"Whoop it",3,4,"Whoop it",6,"Whoop it",8,9]typeWhoopedArrayKeys=0|"Whoop it"|1|3|4|6|8|9|10|(()=>string)|(()=>string)|(()=>0|"Whoop it"|1|3|4|6|8|9|undefined)|((...items: (0|"Whoop it"|1|3|4|6|8|9)[])=>number)|{ ...;}| ... 22more ... |(()=>IterableIterator<...>)typeWhoopedArray2=(0|7|5|2|1|3|4|6|8|9)[]typeWhoopedArray2Keys=0|"Whoop it"|1|3|4|6|8|9|10|(()=>string)|(()=>string)|(()=>0|"Whoop it"|1|3|4|6|8|9|undefined)|((...items: (0|"Whoop it"|1|3|4|6|8|9)[])=>number)|{ ...;}| ... 22more ... |(()=>IterableIterator<...>)Output
Compiler Options
{
"compilerOptions": {
"noImplicitAny": true,
"strictNullChecks": true,
"strictFunctionTypes": true,
"strictBindCallApply": true,
"noImplicitThis": true,
"noImplicitReturns": true,
"useDefineForClassFields": true,
"alwaysStrict": true,
"allowUnusedLabels": true,
"noEmitHelpers": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"preserveConstEnums": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"moduleResolution": 2,
"target": "Latest",
"module": "ESNext"
}
}Playground Link:Provided
TypeScript Version: 4.0.0-beta (same behaviour in version 3.5.1 v3.5.1-Play Ground)
Search Terms:
"key in keyof Array", "keyof Array"
Expected behavior:
using
key in ArrayTypehas the same behaviour as on any object (returning an array type only if the relevant properties are unchanged)Actual behavior:
using
key in ArrayTypeperforms actions on touple entries but the returned type allways includes all default Array propertiesExtention note:
Not the point of this issue and i know there are other issues around this topic. it's just a note,
but how about possibly adding tupple functionality for ArrayLike-, Map- and Set-types? They have all the basic qualities of a tupple, and it would be awesome to use them in a similar fashion (especially inference of
Map.prototype.get/setand[Symbol.iterator]inference of tupples)Related Issues:
#39726
#34780
type-fest/issues/119(external library, but about this this behaviour and includes adHoc fix)
Code
infered types:
Output
Compiler Options
{ "compilerOptions": { "noImplicitAny": true, "strictNullChecks": true, "strictFunctionTypes": true, "strictBindCallApply": true, "noImplicitThis": true, "noImplicitReturns": true, "useDefineForClassFields": true, "alwaysStrict": true, "allowUnusedLabels": true, "noEmitHelpers": true, "noUnusedLocals": true, "noUnusedParameters": true, "preserveConstEnums": true, "experimentalDecorators": true, "emitDecoratorMetadata": true, "moduleResolution": 2, "target": "Latest", "module": "ESNext" } }Playground Link:Provided