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; }
使い方は以下のような感じです。
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
コメント