diff --git a/types/ramda/test/evolve-tests.ts b/types/ramda/test/evolve-tests.ts index 3adf0a1f99..35e86ddc78 100644 --- a/types/ramda/test/evolve-tests.ts +++ b/types/ramda/test/evolve-tests.ts @@ -58,4 +58,31 @@ import * as R from 'ramda'; }); const ex3Test: { a: { b: string; c: null; d: { e: string } } } = ex3; + + // Evolver with a generic: + + const ev1: R.Evolver<{ a: string }> = { a: R.always("b") }; + + // Evolver supports partial transformation: + + const ev2: R.Evolver<{ a: string, b: boolean }> = { b: (b: boolean) => true }; + + // Evolver disallows unknown prop: + + // $ExpectError + const ev3: R.Evolver<{ a: string }> = { b: R.not }; + + // Typed Evolver disallows nesting: + + const ev4: R.Evolver<{ a: { b: boolean } }> = { a: { b: R.not } }; + + // Evolver disallows nesting for primitives: + + // $ExpectError + const ev5: R.Evolver<{ a: string }> = { a: { b: R.not } }; + + // Evolver needs function: + + // $ExpectError + const ev6: R.Evolver = { a: 1 }; }; diff --git a/types/ramda/tools.d.ts b/types/ramda/tools.d.ts index 25bb9d8e3c..5c1c4d88d7 100644 --- a/types/ramda/tools.d.ts +++ b/types/ramda/tools.d.ts @@ -174,11 +174,13 @@ type Evolved = : never; /** - * + * A set of transformation to run as part of an evolve + * @param T - the type to be evolved */ -export interface Evolver { - [key: string]: ((value: any) => any) | Evolver; -} +export type Evolver = any> = { + // if T[K] isn't evolvable, don't allow nesting for that property + [key in keyof Partial]: ((value: T[key]) => T[key]) | (T[key] extends Evolvable ? Evolver : never); +}; /** *