Dies ist für mich das beste Ergebnis bei Google. Ich denke, ich sollte die Lösungen bereitstellen, die ich gefunden habe.
Verwenden von bigint
Jetzt, da es 2020 bigintist und akzeptiert wurde, verdient es eine Erwähnung. Sie können einfach das Folgende tun. Beachten Sie, dass dies biginteine größere Auswirkung auf die Leistung hat als a number.
const myNumber: bigint = 10n
Verwenden eines nominalen Typs / markierten Typs / undurchsichtigen Typs
Eine Alternative ist die Verwendung eines nominalen Typs, aber er ist wohl weniger ergonomisch und ich bin mir nicht sicher, ob er schneller ist als bigint, aber das Muster lässt sich auf jeden Typ verallgemeinern, nicht nur number. TypeScript bietet hierfür keine "erstklassige" Unterstützung, daher müssen Sie einen frechen Hack ausführen. Es gibt eine Bibliothek dafür newtype-ts, die gängige Typen enthält, Integerso dass Sie diese vielleicht nur verwenden möchten, aber ich werde die Funktionsweise unten erklären.
Zunächst definieren wir den integerTyp.
const TAG = Symbol()
type integer = number & { readonly [TAG]: unique symbol }
Das TAG garantieren , dass wir haben einen einzigartigen Wert , so dass wir nicht versehentlich ein Objekt mit dem gleichen Schlüssel machen, und wir machen das Feld ein einzigartiges Symbol auch aus dem gleichen Grunde. Nun, Ihre Ganzzahl hat dieses Objektfeld nicht wirklich, aber das ist in Ordnung.
Damit können Sie noch integerzur numberVerwendung hinzufügen +. Nicht gut. Sie können also die Typensicherheit für die Argumente hier erzwingen, indem Sie das Typsystem mit einer Funktion massieren. Ich werde es nur Wache nennen, und wie Sie sehen, ist es nicht spezifisch für integers - Sie könnten undurchsichtigere Typen erstellen und diese wieder verwenden.
type guard = <A>(f: (...ns: Array<A>) => A, ...ns: Array<A>) => A
const guard: guard = (f, ...ns) => f(...ns)
Wenn Sie versuchen, das mit einem zu nennen number
const bad: integer = guard((a, b) => a + b as integer, myCoolInteger, 10)
Sie erhalten eine Fehlermeldung wie unten
Argument of type '10' is not assignable to parameter of type 'integer'.
Type '10' is not assignable to type '{ readonly [TAG]: unique symbol; }'.(2345)
Beachten Sie, dass Sie den Rückgabetyp hier nicht erzwingen (weil Sie ihn verwenden müssen as integer) und einige Operatoren wie /Gleitkommazahlen zurückgeben, sodass Sie wahrscheinlich weiterhin Laufzeitprüfungen durchführen oder Math.roundeiner speziellen Version von a hinzufügen möchten, dies guardjedoch zumindest sicherzustellen , dass Sie nicht zu verwenden , um zwei getrennte numerische Typen zusammen versuchen - stellen Sie sich haben GBPund USDund versuchen , hinzuzufügen , die, das wäre wahrscheinlich nicht das, was Sie bestimmt.