Skip to content

Using 'Key in keyof ArrayType' always returns an Array regardles of the value manipulation applied #40069

Description

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
"use strict";
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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Needs InvestigationThis issue needs a team member to investigate its status.

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions