Bu benim için Google'daki en iyi sonuç, bu yüzden bulduğum çözümleri sağlamam gerektiğini düşünüyorum.
Kullanma bigint
Şimdi 2020 olduğuna ve bigintkabul edildiğine göre, sözünü hak ediyor. Aşağıdakileri kolayca yapabilirsiniz. A bigintile karşılaştırıldığında daha büyük bir performans etkisine sahip olduğuna dikkat edin number.
const myNumber: bigint = 10n
Nominal tip / etiketli tip / opak tip kullanma
Bir alternatif, nominal bir tür kullanmaktır, ancak tartışmalı olarak daha az ergonomiktir ve bundan daha hızlı olup olmadığından emin değilim bigint, ancak kalıp sadece herhangi bir türe genellemez number. TypeScript, bunun için "birinci sınıf" desteğe sahip değildir, bu yüzden arsız bir hack yapmanız gerekir. Bunun newtype-tsgibi yaygın türleri içeren bir kitaplık var, bu Integernedenle sadece onu kullanmak isteyebilirsiniz, ancak aşağıdaki çalışmaları açıklayacağım.
Başlamak için integertürü tanımlıyoruz .
const TAG = Symbol()
type integer = number & { readonly [TAG]: unique symbol }
TAGYanlışlıkla aynı anahtarla bir nesne yapmazlar böylece olmasını sağlar biz farklı bir değere sahip ve aynı sebepten dolayı eşsiz bir sembol de alan olun. Şimdi, tamsayınız aslında bu nesne alanına sahip olmayacak ama sorun değil.
Bununla hala ekleyebilir integeriçin numberkullanıyor +. İyi değil. Böylece, tür sistemini bir işlevle masaj yaparak buradaki argümanlarda tür güvenliğini uygulayabilirsiniz. Ben sadece ona koruma diyeceğim ve gördüğünüz gibi, bu, integers'ye özgü değil - daha opak tipler yapabilir ve bunu tekrar kullanabilirsiniz.
type guard = <A>(f: (...ns: Array<A>) => A, ...ns: Array<A>) => A
const guard: guard = (f, ...ns) => f(...ns)
Eğer onu aramaya çalışırsan number
const bad: integer = guard((a, b) => a + b as integer, myCoolInteger, 10)
aşağıdaki gibi bir hata alacaksın
Argument of type '10' is not assignable to parameter of type 'integer'.
Type '10' is not assignable to type '{ readonly [TAG]: unique symbol; }'.(2345)
Burada dönüş türünü zorlamadığınızı unutmayın (çünkü kullanmanız gerekir as integer) ve bazı operatörler /kayan nokta sayılarını döndürecek, bu nedenle muhtemelen çalışma zamanı kontrolleri yapmak veya Math.roundözel bir sürümüne bir eklemek isteyeceksiniz guard, ancak bu en azından birlikte iki ayrı sayısal türleri kullanmak çalışmıyoruz sağlamak - sahip hayal GBPve USDve bu eklemeyi deneyin, muhtemelen ne amaçladığınız olmaz.