ウェブサイト検索

javascript - TypeScriptでbigintを初期値として持つ列挙型のようなオブジェクトを作成するにはどうすればよいですか?


理想的に私が行いたいことは次の通りです:

enum Distance {
    Far: 0n,
    Medium, // 1n
    Close, // 2n
}

function Calculate(length: Distance) {
    // do something here
}

残念ながら、enumはまだbigintをサポートしていないので、それはうまくいきません。

私は次のようなことを試してみました:

const Distance = {
    Far: 0n,
    Medium: 1n,
    Close: 2n
}

type Distance = typeof Distance;

function Calculate(length: Distance) {
    const answer = 1n + length;
    // Operator '+' cannot be applied to types 'bigint' and '{ Far: bigint; Medium: bigint; Close: bigint }'
}

しかし、それはうまくいかないようです(通常の列挙型のようには使えません)。

私は BigInt() で単に数値を bigint にキャストできることは知っていますが、それはあまりしたくありません。

数値や文字列の代わりに bigint を使用する enum のように機能するものをどのように作ることができますか?

回答 #1

代わりに定数オブジェクトを使うというあなたの最初のアイデアは良いです。あなたの間違いは、期待しているものとは違う type Distance です:

あなたの値はビッグイントなので、型としてbigintを使用してください:

const Distance = {
    Far: 0n,
    Medium: 1n,
    Close: 2n
}

type Distance = bigint;

function Calculate(length: Distance) {
    const answer = 1n + length;
}

これがうまくいくことがわかります。なぜなら、1n と length の両方がビッグイントだからです。