イーサリアムアドレスのTypeScriptの型

ethers.jsを見ても、イーサアドレスの型は存在しないっぽくて

「じゃあ作るしかないな」と思って書いてみました👇

class Brand {
    private IDENTITY!: T;
}

type Address = Brand<"ADDRESS"> & string

function isEthAddress(v: unknown): v is Address {
    return ethers.utils.isAddress(v);
}

function assertEthAddress(
    v: unknown,
): asserts v is Address {
    if (!isEthAddress(v)) {
        throw new Error("不正なイーサアドレスです");
    }
}

export function createAddress(address: string) {
    const lowerAddress = address.toLowerCase();
    assertEthAddress(lowerAddress);
    return lowerAddress;
}

TypeScriptのPlayground

 

使い方は以下のような感じです。

class User {
    address: Address;
    constructor(address: string) {
        this.address = createAddress(address)
    }
}

//不正なアドレスが渡された場合はエラーになる。
const yamada = new User("0x5e97870f263700f46aa00d967821199b9bc5a120");

 

こんな感じ👆で書くことで、以下のようなメリットを得られます👇

  • Userインスタンスのaddressに不正なアドレスが入ることがなくなる
  • 「イーサアドレスは小文字で運用する」というルールが必ず守られる

 

ただし、「Address型を生成する場合は、必ずcreateAddressを使って生成するようにする」という運用ルールが必要です。

たとえば、Address型をexportしてしまうと、以下👇みたいに出来てしまいます。

const address = "0x5e97870f263700f46aa00d967821199b9bc5a120" as Address

 

参考にさせてもらったページ:

TypeScriptでIDに型をつけて型安全にする #TypeScript – Qiita

実例 FilledString, UserId / TypeScript一人カレンダー

Branded Typesを導入してみる / TypeScript一人カレンダー

Dapp
スポンサーリンク
この記事を書いた人
penpen

1991生まれ。WEBエンジニア。

技術スタック:TypeScript/Next.js/Express/Docker/AWS

フォローする
フォローする
penpenメモ

コメント

タイトルとURLをコピーしました