improve pruneNullishValues + test
This commit is contained in:
33
packages/reacord/helpers/prune-nullish-values.test.ts
Normal file
33
packages/reacord/helpers/prune-nullish-values.test.ts
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
import { expect, test } from "vitest"
|
||||||
|
import { PruneNullishValues, pruneNullishValues } from "./prune-nullish-values"
|
||||||
|
|
||||||
|
test("pruneNullishValues", () => {
|
||||||
|
type InputType = {
|
||||||
|
a: string
|
||||||
|
b: string | null | undefined
|
||||||
|
c?: string
|
||||||
|
d: {
|
||||||
|
a: string
|
||||||
|
b: string | undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const input: InputType = {
|
||||||
|
a: "a",
|
||||||
|
b: null,
|
||||||
|
c: undefined,
|
||||||
|
d: {
|
||||||
|
a: "a",
|
||||||
|
b: undefined,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
const output: PruneNullishValues<InputType> = {
|
||||||
|
a: "a",
|
||||||
|
d: {
|
||||||
|
a: "a",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(pruneNullishValues(input)).toEqual(output)
|
||||||
|
})
|
||||||
@@ -18,10 +18,25 @@ export function pruneNullishValues<T>(input: T): PruneNullishValues<T> {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
type PruneNullishValues<Input> = Input extends ReadonlyArray<infer Value>
|
export type PruneNullishValues<Input> = Input extends object
|
||||||
? ReadonlyArray<NonNullable<Value>>
|
? OptionalKeys<
|
||||||
: Input extends object
|
{ [Key in keyof Input]: NonNullable<PruneNullishValues<Input[Key]>> },
|
||||||
? {
|
KeysWithNullishValues<Input>
|
||||||
[Key in keyof Input]: NonNullable<Input[Key]>
|
>
|
||||||
}
|
|
||||||
: Input
|
: Input
|
||||||
|
|
||||||
|
type OptionalKeys<Input, Keys extends keyof Input> = Omit<Input, Keys> & {
|
||||||
|
[Key in Keys]?: Input[Key]
|
||||||
|
}
|
||||||
|
|
||||||
|
type KeysWithNullishValues<Input> = NonNullable<
|
||||||
|
Values<{
|
||||||
|
[Key in keyof Input]: null extends Input[Key]
|
||||||
|
? Key
|
||||||
|
: undefined extends Input[Key]
|
||||||
|
? Key
|
||||||
|
: never
|
||||||
|
}>
|
||||||
|
>
|
||||||
|
|
||||||
|
type Values<Input> = Input[keyof Input]
|
||||||
|
|||||||
Reference in New Issue
Block a user