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
コメント