mirror of
https://github.com/Kir-Antipov/mc-publish.git
synced 2024-11-25 09:51:01 -05:00
Implemented getSafe
method
This commit is contained in:
parent
de17c8b440
commit
149430bbe9
3 changed files with 79 additions and 0 deletions
|
@ -30,4 +30,5 @@ export {
|
||||||
getOwnEntries,
|
getOwnEntries,
|
||||||
|
|
||||||
merge,
|
merge,
|
||||||
|
getSafe,
|
||||||
} from "./object-reflector";
|
} from "./object-reflector";
|
||||||
|
|
|
@ -205,3 +205,26 @@ export function merge<T extends unknown[]>(...values: T): UnionToIntersection<T[
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Safely retrieves a property value from an object, or returns `undefined` if the property is not accessible.
|
||||||
|
*
|
||||||
|
* @template T - The type of the object.
|
||||||
|
* @template K - The type of the property key.
|
||||||
|
*
|
||||||
|
* @param target - The object from which to retrieve the property value.
|
||||||
|
* @param key - The key of the property to retrieve.
|
||||||
|
*
|
||||||
|
* @returns The value of the property if accessible, otherwise `undefined`.
|
||||||
|
*/
|
||||||
|
export function getSafe<T, K extends PropertyKey>(target: T, key: K): (K extends keyof T ? T[K] : unknown) | undefined {
|
||||||
|
if (target === null || target === undefined) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
return target[key as string];
|
||||||
|
} catch {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@ import {
|
||||||
getAllValues,
|
getAllValues,
|
||||||
getOwnEntries,
|
getOwnEntries,
|
||||||
getPropertyDescriptor,
|
getPropertyDescriptor,
|
||||||
|
getSafe,
|
||||||
merge,
|
merge,
|
||||||
} from "@/utils/reflection/object-reflector";
|
} from "@/utils/reflection/object-reflector";
|
||||||
|
|
||||||
|
@ -195,3 +196,57 @@ describe("merge", () => {
|
||||||
expect(Object.getOwnPropertyDescriptor(merged, "b")).toEqual(Object.getOwnPropertyDescriptor(obj2, "b"));
|
expect(Object.getOwnPropertyDescriptor(merged, "b")).toEqual(Object.getOwnPropertyDescriptor(obj2, "b"));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("getSafe", () => {
|
||||||
|
it("returns the value of an existing property", () => {
|
||||||
|
const obj = {
|
||||||
|
name: "John",
|
||||||
|
age: 30,
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(getSafe(obj, "name")).toBe("John");
|
||||||
|
expect(getSafe(obj, "age")).toBe(30);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("handles array indices as keys", () => {
|
||||||
|
const arr = ["apple", "banana", "cherry"] as const;
|
||||||
|
|
||||||
|
expect(getSafe(arr, 0)).toBe("apple");
|
||||||
|
expect(getSafe(arr, 1)).toBe("banana");
|
||||||
|
expect(getSafe(arr, 2)).toBe("cherry");
|
||||||
|
expect(getSafe(arr, 3)).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("handles Symbols as keys", () => {
|
||||||
|
const obj = {
|
||||||
|
[Symbol.toStringTag]: "Not Object",
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(getSafe(obj, Symbol.toStringTag)).toBe("Not Object");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns undefined for non-existent properties", () => {
|
||||||
|
const obj = {
|
||||||
|
name: "John",
|
||||||
|
age: 30,
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(getSafe(obj, "address")).toBeUndefined();
|
||||||
|
expect(getSafe(obj, "salary")).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns undefined if accessing the property is not possible", () => {
|
||||||
|
const obj = {
|
||||||
|
get name(): string {
|
||||||
|
throw new Error();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(getSafe(obj, "name")).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns undefined when the target object is null or undefined", () => {
|
||||||
|
expect(getSafe(null, "name")).toBeUndefined();
|
||||||
|
expect(getSafe(undefined, "name")).toBeUndefined();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
Loading…
Reference in a new issue