TypeScriptのBigIntを触ってみる

TypeScript Advent Calendar 2018の22日目の記事です。

こんにちは@mrsekutです。

先日、TypeScriptの3.2がリリースされました。
いろいろな細かい機能が入ったのですが、その中からBigIntについて取り上げます。

本当は他のつよつよさんたちと同じように型をがちがちしたかっこいい記事を書きたかったのですが、理解と時間が足らなかったので、お預けです。
いつか書きます。

ちなみにTypeScript3.2で変更のあった箇所は以下の記事でまとめられています。

【参考】TypeScript 3.2.0-RC 変更点 – Qiita

公式とかのリンク

前準備

使うには "target": "esnext" が必要です。

前のブログのリンク、環境構築などはn日目に書いた記事を参考にしてください。

BigIntってなに?

さて、本題です。

TypeScript3.2からBigIntがサポートされましたが、そもそもBigIntってなんですか??って感じですが、簡単に言うと、

整数値がInt型で正確にサポートされる範囲を超える可能性があるものを扱う型のことです。

「Int型で正確にサポートされる範囲」は、Number.MAX_SAFE_INTEGERで確認することができます。

これは、IEEE 754の倍精度浮動小数点型数値の52bitの仮数部で表現できる最大値である2^53-1になります。

これ以上の数値が表示できないわけではないのですが、正確であることが保証されなくなります。
実際下のコードの3行目は明らかに左辺と右辺は等しくないですが、trueと出力されます。

ちなみに、JSで表現できる最大数値はNumber.MAX_VALUEで確認できます。

 

【参考】

導入された型 bigint

今回のリリースで新しいプリミティブ型である「bigint」型が導入されました。

bigint

全て小文字の「bigint」型です。
これは、プリミティブ型になります。

以下の2通りの方法で宣言できます。

使ってみる

基本的な計算

基本的な演算はbigint同士ならできます。

フィボナッチ

10000番目のフィボナッチ数を求めるプログラムを書いてみました。

2090桁の答えが出力されます。

注意すること

numberとbigintは非互換

number型とbigint型は非互換なので、計算や===での比較はコンパイルエラーになります。

ただ、大小関係は使えるようです。

【参考】TypeScript/numberVsBigIntOperations.types

代入もできません。

ですが、これはcastすることで解決できます。

type guard記法は他の型同様に使えました。

その他

見渡していると、asUnitNとかasIntNなどの、width-bitの値に収めるユーティリティ関数があったり、BigUint64ArrayやBigInt64Arrayなどのの型も追加されているようです。

【参考】TypeScript/lib.esnext.bigint.d.ts

また、従来の数値型とbigint型でベンチマークを取っている記事がありました。
いつでもどこでもbigintを使えばいいというわけでもなさそうです。

【参考】JavaScriptの任意精度整数: BigInt vs big-integer (2018年11月2日追記) – Qiita

参考