<S extends object, E extends KeyEvolver<S>>(e: E): (
self: S
) => KeyEvolved<S, E>
<S extends object, E extends KeyEvolver<S>>(self: S, e: E): KeyEvolved<
S,
E
>Transforms keys of a struct selectively using per-key functions. Keys without a corresponding function are copied unchanged.
When to use
Use when you need computed key names, such as uppercasing or prefixing.
Details
Each transform function receives the key name and must return a new
PropertyKey.
Example (Renaming keys with functions)
import { pipe, Struct } from "effect"
const result = pipe(
{ name: "Alice", age: 30 },
Struct.evolveKeys({
name: (k) => k.toUpperCase()
})
)
console.log(result) // { NAME: "Alice", age: 30 }export const const evolveKeys: {
<S extends object, E extends KeyEvolver<S>>(
e: E
): (self: S) => KeyEvolved<S, E>
<S extends object, E extends KeyEvolver<S>>(
self: S,
e: E
): KeyEvolved<S, E>
}
Transforms keys of a struct selectively using per-key functions. Keys without
a corresponding function are copied unchanged.
When to use
Use when you need computed key names, such as uppercasing or prefixing.
Details
Each transform function receives the key name and must return a new
PropertyKey.
Example (Renaming keys with functions)
import { pipe, Struct } from "effect"
const result = pipe(
{ name: "Alice", age: 30 },
Struct.evolveKeys({
name: (k) => k.toUpperCase()
})
)
console.log(result) // { NAME: "Alice", age: 30 }
evolveKeys: {
<function (type parameter) S in <S extends object, E extends KeyEvolver<S>>(e: E): (self: S) => KeyEvolved<S, E>S extends object, function (type parameter) E in <S extends object, E extends KeyEvolver<S>>(e: E): (self: S) => KeyEvolved<S, E>E extends type KeyEvolver<S> = {
readonly [K in keyof S]?:
| ((k: K) => PropertyKey)
| undefined
}
KeyEvolver<function (type parameter) S in <S extends object, E extends KeyEvolver<S>>(e: E): (self: S) => KeyEvolved<S, E>S>>(e: E extends KeyEvolver<S>e: function (type parameter) E in <S extends object, E extends KeyEvolver<S>>(e: E): (self: S) => KeyEvolved<S, E>E): (self: S extends objectself: function (type parameter) S in <S extends object, E extends KeyEvolver<S>>(e: E): (self: S) => KeyEvolved<S, E>S) => type KeyEvolved<S, E> = { [K in keyof { [K in keyof S as K extends keyof E ? E[K] extends (k: K) => infer R extends PropertyKey ? R : K : K]: S[K]; }]: { [K in keyof S as K extends keyof E ? E[K] extends (k: K) => infer R extends PropertyKey ? R : K : K]: S[K]; }[K]; }KeyEvolved<function (type parameter) S in <S extends object, E extends KeyEvolver<S>>(e: E): (self: S) => KeyEvolved<S, E>S, function (type parameter) E in <S extends object, E extends KeyEvolver<S>>(e: E): (self: S) => KeyEvolved<S, E>E>
<function (type parameter) S in <S extends object, E extends KeyEvolver<S>>(self: S, e: E): KeyEvolved<S, E>S extends object, function (type parameter) E in <S extends object, E extends KeyEvolver<S>>(self: S, e: E): KeyEvolved<S, E>E extends type KeyEvolver<S> = {
readonly [K in keyof S]?:
| ((k: K) => PropertyKey)
| undefined
}
KeyEvolver<function (type parameter) S in <S extends object, E extends KeyEvolver<S>>(self: S, e: E): KeyEvolved<S, E>S>>(self: S extends objectself: function (type parameter) S in <S extends object, E extends KeyEvolver<S>>(self: S, e: E): KeyEvolved<S, E>S, e: E extends KeyEvolver<S>e: function (type parameter) E in <S extends object, E extends KeyEvolver<S>>(self: S, e: E): KeyEvolved<S, E>E): type KeyEvolved<S, E> = { [K in keyof { [K in keyof S as K extends keyof E ? E[K] extends (k: K) => infer R extends PropertyKey ? R : K : K]: S[K]; }]: { [K in keyof S as K extends keyof E ? E[K] extends (k: K) => infer R extends PropertyKey ? R : K : K]: S[K]; }[K]; }KeyEvolved<function (type parameter) S in <S extends object, E extends KeyEvolver<S>>(self: S, e: E): KeyEvolved<S, E>S, function (type parameter) E in <S extends object, E extends KeyEvolver<S>>(self: S, e: E): KeyEvolved<S, E>E>
} = import dualdual(
2,
<function (type parameter) S in <S extends object, E extends KeyEvolver<S>>(self: S, e: E): KeyEvolved<S, E>S extends object, function (type parameter) E in <S extends object, E extends KeyEvolver<S>>(self: S, e: E): KeyEvolved<S, E>E extends type KeyEvolver<S> = {
readonly [K in keyof S]?:
| ((k: K) => PropertyKey)
| undefined
}
KeyEvolver<function (type parameter) S in <S extends object, E extends KeyEvolver<S>>(self: S, e: E): KeyEvolved<S, E>S>>(self: S extends objectself: function (type parameter) S in <S extends object, E extends KeyEvolver<S>>(self: S, e: E): KeyEvolved<S, E>S, e: E extends KeyEvolver<S>e: function (type parameter) E in <S extends object, E extends KeyEvolver<S>>(self: S, e: E): KeyEvolved<S, E>E): type KeyEvolved<S, E> = { [K in keyof { [K in keyof S as K extends keyof E ? E[K] extends (k: K) => infer R extends PropertyKey ? R : K : K]: S[K]; }]: { [K in keyof S as K extends keyof E ? E[K] extends (k: K) => infer R extends PropertyKey ? R : K : K]: S[K]; }[K]; }KeyEvolved<function (type parameter) S in <S extends object, E extends KeyEvolver<S>>(self: S, e: E): KeyEvolved<S, E>S, function (type parameter) E in <S extends object, E extends KeyEvolver<S>>(self: S, e: E): KeyEvolved<S, E>E> => {
return function buildStruct<S, (k: keyof S, v: S[keyof S]) => [any, S[keyof S]]>(source: S, f: (k: keyof S, v: S[keyof S]) => [any, S[keyof S]]): anyWalk source; for each key decide what to emit via the small callback.
The callback returns either
• undefined → nothing is copied, or
• [newKey, newVal]
so every public API just supplies a different callback.
buildStruct(self: S extends objectself, (k: keyof Sk, v: S[keyof S]v) => [var Object: ObjectConstructorProvides functionality common to all JavaScript objects.
Object.ObjectConstructor.hasOwn(o: object, v: PropertyKey): booleanDetermines whether an object has a property with the specified name.
hasOwn(e: E extends KeyEvolver<S>e, k: string | number | symbolk) ? (e: E extends KeyEvolver<S>e as any)[k: keyof Sk](k: string | number | symbolk) : k: string | number | symbolk, v: S[keyof S]v])
}
)