-
Notifications
You must be signed in to change notification settings - Fork 13.1k
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.
Metadata
Metadata
Assignees
Labels
Not a DefectThis behavior is one of several equally-correct optionsThis behavior is one of several equally-correct options