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.
The text was updated successfully, but these errors were encountered:
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.
🔎 Search Terms
"narrow tuple", "tuple inference"
🕗 Version & Regression Information
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".
⏯ Playground Link
https://www.typescriptlang.org/play/#code/JYOwLgpgTgZghgYwgAgCrIN4F8BQOED2IAzmMmADbCkBcyA2ugD7IgCuFFANGsi+5wC6yALwMB3VhwqCcAejnIA8gGlkwGOSql1xZAApmUzgEp6wgEZsyIAmRgEo5NgAcKEYjytkAksgC2EHAgyHDObigWEAhwbMQo7iAA5mAAFrrIMMAAHhAAJngwbCAIYMBEyKnBee76lNRgdIw8qIImmDjIXVoNOLg4Ggb1pAB0EABu0ACedaIAfOTIAIQiYhIm7Rid3VUgNRB12mAmfXiDhw30AAzCK2vSyABkjz2k9ACMt6vGFJvbXbt9hdSCdcEA
💻 Code
🙁 Actual behavior
handle(tlist)
throws in the TS compiler:🙂 Expected behavior
The condition in both
if
blocks should narrowtlist
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 oftlist
is known and will never change.The text was updated successfully, but these errors were encountered: