<S extends object, const Keys extends ReadonlyArray<keyof S>>(
keys: Keys
): (self: S) => Simplify<Omit<S, Keys[number]>>
<S extends object, const Keys extends ReadonlyArray<keyof S>>(
self: S,
keys: Keys
): Simplify<Omit<S, Keys[number]>>Creates a new struct with the specified keys removed.
When to use
Use to exclude sensitive or irrelevant fields from a struct.
Gotchas
Keys not present in the struct are silently ignored.
Example (Removing a property)
import { pipe, Struct } from "effect"
const user = { name: "Alice", age: 30, password: "secret" }
const safe = pipe(user, Struct.omit(["password"]))
console.log(safe) // { name: "Alice", age: 30 }export const const omit: {
<
S extends object,
Keys extends ReadonlyArray<keyof S>
>(
keys: Keys
): (self: S) => Simplify<Omit<S, Keys[number]>>
<
S extends object,
Keys extends ReadonlyArray<keyof S>
>(
self: S,
keys: Keys
): Simplify<Omit<S, Keys[number]>>
}
Creates a new struct with the specified keys removed.
When to use
Use to exclude sensitive or irrelevant fields from a struct.
Gotchas
Keys not present in the struct are silently ignored.
Example (Removing a property)
import { pipe, Struct } from "effect"
const user = { name: "Alice", age: 30, password: "secret" }
const safe = pipe(user, Struct.omit(["password"]))
console.log(safe) // { name: "Alice", age: 30 }
omit: {
<function (type parameter) S in <S extends object, const Keys extends ReadonlyArray<keyof S>>(keys: Keys): (self: S) => Simplify<Omit<S, Keys[number]>>S extends object, const function (type parameter) Keys in <S extends object, const Keys extends ReadonlyArray<keyof S>>(keys: Keys): (self: S) => Simplify<Omit<S, Keys[number]>>Keys extends interface ReadonlyArray<T>ReadonlyArray<keyof function (type parameter) S in <S extends object, const Keys extends ReadonlyArray<keyof S>>(keys: Keys): (self: S) => Simplify<Omit<S, Keys[number]>>S>>(
keys: const Keys extends ReadonlyArray<keyof S>keys: function (type parameter) Keys in <S extends object, const Keys extends ReadonlyArray<keyof S>>(keys: Keys): (self: S) => Simplify<Omit<S, Keys[number]>>Keys
): (self: S extends objectself: function (type parameter) S in <S extends object, const Keys extends ReadonlyArray<keyof S>>(keys: Keys): (self: S) => Simplify<Omit<S, Keys[number]>>S) => type Simplify<T> = {
[K in keyof T]: T[K]
}
Flattens intersection types into a single object type for readability.
When to use
Use when hovering over a type shows A & B & C instead of the merged shape.
Details
This helper is purely cosmetic at the type level and has no runtime effect.
It preserves readonly modifiers; use
Mutable
to strip them.
Example (Flattening an intersection)
import type { Struct } from "effect"
type Original = { a: string } & { b: number }
// Without Simplify, the type displays as `{ a: string } & { b: number }`
type Simplified = Struct.Simplify<Original>
// { a: string; b: number }
Simplify<type Omit<T, K extends keyof any> = {
[P in Exclude<keyof T, K>]: T[P]
}
Construct a type with the properties of T except for those in type K.
Omit<function (type parameter) S in <S extends object, const Keys extends ReadonlyArray<keyof S>>(keys: Keys): (self: S) => Simplify<Omit<S, Keys[number]>>S, function (type parameter) Keys in <S extends object, const Keys extends ReadonlyArray<keyof S>>(keys: Keys): (self: S) => Simplify<Omit<S, Keys[number]>>Keys[number]>>
<function (type parameter) S in <S extends object, const Keys extends ReadonlyArray<keyof S>>(self: S, keys: Keys): Simplify<Omit<S, Keys[number]>>S extends object, const function (type parameter) Keys in <S extends object, const Keys extends ReadonlyArray<keyof S>>(self: S, keys: Keys): Simplify<Omit<S, Keys[number]>>Keys extends interface ReadonlyArray<T>ReadonlyArray<keyof function (type parameter) S in <S extends object, const Keys extends ReadonlyArray<keyof S>>(self: S, keys: Keys): Simplify<Omit<S, Keys[number]>>S>>(self: S extends objectself: function (type parameter) S in <S extends object, const Keys extends ReadonlyArray<keyof S>>(self: S, keys: Keys): Simplify<Omit<S, Keys[number]>>S, keys: const Keys extends ReadonlyArray<keyof S>keys: function (type parameter) Keys in <S extends object, const Keys extends ReadonlyArray<keyof S>>(self: S, keys: Keys): Simplify<Omit<S, Keys[number]>>Keys): type Simplify<T> = {
[K in keyof T]: T[K]
}
Flattens intersection types into a single object type for readability.
When to use
Use when hovering over a type shows A & B & C instead of the merged shape.
Details
This helper is purely cosmetic at the type level and has no runtime effect.
It preserves readonly modifiers; use
Mutable
to strip them.
Example (Flattening an intersection)
import type { Struct } from "effect"
type Original = { a: string } & { b: number }
// Without Simplify, the type displays as `{ a: string } & { b: number }`
type Simplified = Struct.Simplify<Original>
// { a: string; b: number }
Simplify<type Omit<T, K extends keyof any> = {
[P in Exclude<keyof T, K>]: T[P]
}
Construct a type with the properties of T except for those in type K.
Omit<function (type parameter) S in <S extends object, const Keys extends ReadonlyArray<keyof S>>(self: S, keys: Keys): Simplify<Omit<S, Keys[number]>>S, function (type parameter) Keys in <S extends object, const Keys extends ReadonlyArray<keyof S>>(self: S, keys: Keys): Simplify<Omit<S, Keys[number]>>Keys[number]>>
} = import dualdual(
2,
<function (type parameter) S in <S extends object, Keys extends ReadonlyArray<keyof S>>(self: S, keys: Keys): anyS extends object, function (type parameter) Keys in <S extends object, Keys extends ReadonlyArray<keyof S>>(self: S, keys: Keys): anyKeys extends interface ReadonlyArray<T>ReadonlyArray<keyof function (type parameter) S in <S extends object, Keys extends ReadonlyArray<keyof S>>(self: S, keys: Keys): anyS>>(self: S extends objectself: function (type parameter) S in <S extends object, Keys extends ReadonlyArray<keyof S>>(self: S, keys: Keys): anyS, keys: Keys extends ReadonlyArray<keyof S>keys: function (type parameter) Keys in <S extends object, Keys extends ReadonlyArray<keyof S>>(self: S, keys: Keys): anyKeys) => {
return function buildStruct<S, (k: keyof S, v: S[keyof S]) => [keyof S, S[keyof S]] | undefined>(source: S, f: (k: keyof S, v: S[keyof S]) => [keyof S, S[keyof S]] | undefined): 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) => (!keys: Keys extends ReadonlyArray<keyof S>keys.ReadonlyArray<keyof S>.includes(searchElement: keyof S, fromIndex?: number): booleanDetermines whether an array includes a certain element, returning true or false as appropriate.
includes(k: keyof Sk) ? [k: keyof Sk, v: S[keyof S]v] : var undefinedundefined))
}
)