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
This is the behavior in every version I tried in the playground (v3.3, v4.5, v5.8, nightly), and I reviewed the FAQ about "tuple", "narrow", "inference".
interfaceT{}consttlist: [T|null,T|null]=[null,null]// OK if tlist is (T | null)[] but not for tuples, but I mean a tuple because length is fixedfunctionhandle(tlist: [T,T]){tlist}if(tlist.every(t=>t!==null)){handle(tlist)}if(tlist[0]!==null&&tlist[1]!==null){handle(tlist)}
🙁 Actual behavior
handle(tlist) throws in the TS compiler:
Argument of type '[T | null, T | null] & T[]' is not assignable to parameter of type '[T, T]'.
Types of property '0' are incompatible.
Type 'T | null' is not assignable to type 'T'.
Type 'null' is not assignable to type 'T'.
🙂 Expected behavior
The condition in both if blocks should narrow tlist to the type [T, T], i.e. no error.
Additional information about the issue
It is OK if tlist is (T | null)[], but not for tuples. However, I really want to use a tuple here because the length of tlist is known and will never change.
Your second example is effectively a duplicate of #42384.
Your first example is a limitation of the type predicates on array methods like every(). You could merge your own call signature to handle tuples also, maybe like
interfaceArray<T>{every<SextendsT>(predicate: (value: T,index: number,array: T[])=>value is S,thisArg?: any): this is {[Iinkeyof this]: this[I]&S};}
but I'm sure there are weird edge cases. Curiously I searched but I didn't find any existing issues filed about the type predicate methods on tuples, so maybe this isn't a duplicate of an existing issue? There are near-misses about map() on tuples not producing tuples.
Activity
jcalz commentedon Mar 3, 2025
Your second example is effectively a duplicate of #42384.
Your first example is a limitation of the type predicates on array methods like
every(). You could merge your own call signature to handle tuples also, maybe likePlayground link
but I'm sure there are weird edge cases. Curiously I searched but I didn't find any existing issues filed about the type predicate methods on tuples, so maybe this isn't a duplicate of an existing issue? There are near-misses about
map()on tuples not producing tuples.typescript-bot commentedon Mar 6, 2025
This issue has been marked as "Duplicate" and has seen no recent activity. It has been automatically closed for house-keeping purposes.