-
Notifications
You must be signed in to change notification settings - Fork 13.1k
Description
🔎 Search Terms
bigint, operator, arithmetic, number, subtype, extend, generic, type parameter, incorrect, inference, inferred type, operation, 2365, TS2365
🕗 Version & Regression Information
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about arithmetic/bigints/etc
⏯ Playground Link
💻 Code
function bitsetIntersect<Bits extends bigint>(a: Bits, b: Bits): number {
// intersection is inferred to have type `number` rather than `bigint`
const intersection = a & b;
// 5.8.2 reports no type error,
// but a runtime error occurs:
// [ERR]: Cannot mix BigInt and other types, use explicit conversions
return intersection - 1;
}
console.log(bitsetIntersect(7n, 5n));🙁 Actual behavior
intersection is inferred to have type number. As a result, no type errors are reported.
When run, the code encounters a TypeError because intersection - 1 attempts to perform arithmetic on a bigint and a number:
[ERR]: Cannot mix BigInt and other types, use explicit conversions
🙂 Expected behavior
intersection should be inferred to have type bigint.
Thus the operation intersection - 1 should report a type error:
Operator '-' cannot be applied to types 'bigint' and 'number'. (2365)
Additional information about the issue
This issue is most likely to be hit when branding bigint, but it could also appear in other situations, such as using subtypes which are unions of literals.
I found some issues that are similar, but have a different scope. These issues were closed as intended, but in these issues, larger type bounds which include bigint but also include number (such as any or bigint | number) are used:
- in generic<T extends bigint|number> T * T is deduced as number instead of T #39569
- Cannot use bigint with any in certain arithmetic expressions #41741
- The type of bitwise operations on 'any' operands should be 'number | bigint' #42125
- Update expressions with untyped argument are typed
number, notnumber | bigint#49558 - Unary minus on 'any' should infer type to 'number | bigint', not just 'number' #60914