src/util/guards.ts (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
export const isRecord = (v: unknown): v is Readonly<Record<string, unknown>> =>
typeof v === "object" && v !== null && !Array.isArray(v);
export const asRecord = (v: unknown): Readonly<Record<string, unknown>> | undefined =>
isRecord(v) ? v : undefined;
export const asString = (v: unknown): string | undefined => (typeof v === "string" ? v : undefined);
export const asNumber = (v: unknown): number | undefined => (typeof v === "number" ? v : undefined);
export const asBoolean = (v: unknown): boolean | undefined => (typeof v === "boolean" ? v : undefined);
export const asArrayOf = <T>(
v: unknown,
item: (x: unknown) => T | undefined,
): ReadonlyArray<T> | undefined => {
if (!Array.isArray(v)) return undefined;
const out: T[] = [];
for (const x of v) {
const parsed = item(x);
if (parsed === undefined) return undefined;
out.push(parsed);
}
return out;
};
export const errnoCode = (e: unknown): string | undefined => {
if (!(e instanceof Error) || !("code" in e)) return undefined;
return asString(e.code);
};
|