WebCrypto API などでバイナリデータを扱うと、new Uint8Array を頻繁に呼び出すことになる。毎回長い構文を書くのは億劫なので、簡潔に書けるラッパーを用意した。
コード
const BYTE_LENGTH = "byteLength";
export function toU8Array(length: number): Uint8Array;export function toU8Array( array: ArrayLike<number> | ArrayBufferLike): Uint8Array;export function toU8Array( buffer: ArrayBufferLike, byteOffset?: number, length?: number): Uint8Array;export function toU8Array( arg1: number | ArrayLike<number> | ArrayBufferLike, arg2?: number, arg3?: number): Uint8Array { return typeof arg1 === "number" ? new Uint8Array(arg1) : BYTE_LENGTH in arg1 ? new Uint8Array(arg1, arg2, arg3) : new Uint8Array(arg1);}使用例
指定した長さで初期化
const arr = toU8Array(32);// Uint8Array(32) [0, 0, 0, ...] - ランダム値用のバッファとしてBase64 デコード後の変換
const base64 = "SGVsbG8gV29ybGQh";const binary = Uint8Array.from(atob(base64), c => c.charCodeAt(0));const arr = toU8Array(binary);ArrayBuffer の一部をビューとして取得
const buffer = new ArrayBuffer(64);const arr = toU8Array(buffer, 16, 16);// 16バイト目から16要素分のビュー実装のポイント
BYTE_LENGTH を定数として定義することで、minify 時の最適化を考慮している。型ガードの順序も重要で、まず number かどうかをチェックし、次に byteLength プロパティの有無で ArrayBufferLike を判定し、それ以外を ArrayLike として扱う。
シンプルな変換なら new Uint8Array で十分だが、型安全に統一的なインターフェースで扱いたい時にこのラッパーは有効だ。
hsb.horse