From 3845646828e98f3c7cda1217f6cfe5f642ac0603 Mon Sep 17 00:00:00 2001 From: Michael Arnaldi Date: Thu, 18 Jul 2024 03:01:45 +0200 Subject: [PATCH] Implement Struct.keys as a typed alternative to Object.keys (#3282) --- .changeset/lovely-buckets-sip.md | 19 +++++++++++++++++++ packages/effect/src/Struct.ts | 22 ++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 .changeset/lovely-buckets-sip.md diff --git a/.changeset/lovely-buckets-sip.md b/.changeset/lovely-buckets-sip.md new file mode 100644 index 0000000000..bd3a04fa54 --- /dev/null +++ b/.changeset/lovely-buckets-sip.md @@ -0,0 +1,19 @@ +--- +"effect": minor +--- + +Implement Struct.keys as a typed alternative to Object.keys + +```ts +import { Struct } from "effect" + +const symbol: unique symbol = Symbol() + +const value = { + a: 1, + b: 2, + [symbol]: 3 +} + +const keys: Array<"a" | "b"> = Struct.keys(value) +``` diff --git a/packages/effect/src/Struct.ts b/packages/effect/src/Struct.ts index 862cd34e1f..fdf8da818c 100644 --- a/packages/effect/src/Struct.ts +++ b/packages/effect/src/Struct.ts @@ -179,3 +179,25 @@ export const evolve: { export const get = (key: K) => (s: S): MatchRecord => s[key] + +/** + * Retrieves the object keys that are strings in a typed manner + * + * @example + * import { Struct } from "effect" + * + * const symbol: unique symbol = Symbol() + * + * const value = { + * a: 1, + * b: 2, + * [symbol]: 3 + * } + * + * const keys: Array<"a" | "b"> = Struct.keys(value) + * + * assert.deepStrictEqual(keys, ["a", "b"]) + * + * @since 3.6.0 + */ +export const keys = (o: T): Array<(keyof T) & string> => Object.keys(o) as Array<(keyof T) & string>