Repository navigation
When the initial element of the tuple is a rest element, it is not possible to correctly infer the type of the initial element.ย #56885
Description
Activity
Actually this is not a new feature. See #49138 which was fixed in 5.0.8.I am now assuming this is a feature request.
It is a bug - considertype T1 = [...string[], number, boolean] const arr1: T1 = [2, true]; const arr2: T1 = ["", 2, true]; const arr3: T1 = [true]; // error // ~~~~ // Type '[true]' is not assignable to type 'T1'. // Source has 1 element(s) but target requires 2. declare const arr: T1; const head = arr[0] // Actual: string | number | boolean // Expected: string | number
Reacted by Bruce PascoeBruce Pascoe (@fatcerberus)
Let me clarify my statement.I am making two assumptions:
- that the current assignment behavior is correct
- that correct indexing behavior should follow exactly the results of assignment behavior
Joe Calzaretta (@jcalz) asserts here that "Yes, that type (
arr[0]) is wider than it should be, but that's not a bug, it's a design decision."In other words, that my assumption 2 is incorrect.
Certainly there are times when economy of calculation dictates using wider types. Other times it may just be expedient coding.
Either of those would enough to invalidate my assumption 2.Therefore I will withdraw my statement that this must be a bug, and instead assume it is a feature request.
ๆพๅ (@13OnTheCode) - As a feature request, I believe more explanation is required.
Currently, you have your motivating example code listed in the suggestion section, and the motivating example and use cases sections are empty.
Here is an example:
Suggestion
- Tuple indexed access, start-relative or end-relative, by a literal number, should return the minimal possible type set.
You could also give an algorithm that computes that.
...that correct indexing behavior should follow exactly the results of assignment behavior
Yes, this assumption is incorrect. The PR that implemented mid/lead rest elements (#41544) specifically calls out the current indexing behavior, suggesting it's intentional (or at least a known-upfront design limitation).
From #41544:
Also note that indexing a tuple type beyond its starting fixed elements (if any) yields a union type of all possible element types
Reacted by Craig P Hicks and Andrea Simone Costa- addedSuggestionAn idea for TypeScriptAn idea for TypeScriptAwaiting More FeedbackThis means we'd like to hear from more people who would be helped by this featureThis means we'd like to hear from more people who would be helped by this feature
on Jan 2, 2024
๐ Search Terms
initial element of the tuple is a rest element
โ Viability Checklist
โญ Suggestion
๐ Motivating Example
๐ป Use Cases
#56883