-
Notifications
You must be signed in to change notification settings - Fork 13.2k
Closed as not planned
Labels
Not a DefectThis behavior is one of several equally-correct optionsThis behavior is one of several equally-correct options
Description
π Search Terms
bigint negative zero template
π Version & Regression Information
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about bigint
β― Playground Link
π» Code
type PosZero = 0n;
type NegZero = -0n; // ?!
// ^? - type NegZero = 0n
const pz: PosZero = -0n;
const nz: NegZero = 0n;
type StrNegZero = `${-0n}` // ?!
// ^? - type StrNegZero = "0"
type StrBigInt = `${number}`
const x: StrBigInt = "-0"; // ?!
type ParseBigInt<T extends `${bigint}`> = T extends `${infer Int extends bigint}` ? Int : never
type PositiveOne = ParseBigInt<'1'>
// ^? - type PositiveOne = 1n
type NegativeOne = ParseBigInt<'-1'>
// ^? - type NegativeOne = -1n
type PositiveZero = ParseBigInt<'0'>
// ^? - type PositiveZero = 0n
type NegativeZero = ParseBigInt<'-0'> // ?!
// ^? - type NegativeZero = bigintπ Actual behavior
-0n is a valid and evalutates to 0n, and "-0" matches `${bigint}`, but `${-0n}` evalutates to "0", and "-0" is not successfully inferred as 0n
π Expected behavior
-0n should either not exist, or it should be handled consistently with other bigint literals.
Either:
-0nshould fail, and"-0"should not match`${bigint}`, because-0nis not a valid bigint value, and thus no such bigint stringifies to-0."-0"should be inferred to contain0n/-0n, because-0nis valid syntax that evalutates to0n.
Additional information about the issue
Credit to mkantor and sinclair in the TypeScript Community for extra examples.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
Not a DefectThis behavior is one of several equally-correct optionsThis behavior is one of several equally-correct options