Skip to content

R.evolve is not deriving type from curried evolver #438

@bandreetto

Description

@bandreetto

When the evolver passed to the evolve object is a curried function it is not resolving the type to the return of the curried function:

import R from 'ramda';

interface JobInfo {
  currentJob: string,
  previousJob?: string,
}

interface Person {
  name: string,
  job: JobInfo,
}

const developer: Person = {
  name: 'John Doe',
  job: {
    currentJob: 'Developer',
  }
}

const changeJob = R.curry(
  (newJob: string, job: JobInfo) => {
    return {
      currentJob: newJob,
      previousJob: job.currentJob,
    }
});

const designer: Person = R.evolve({
  job: changeJob('Designer'),
}, developer); // Throws ts error

Although if you explicit the types in the evolve generics it works:

import R from 'ramda';

interface JobInfo {
  currentJob: string,
  previousJob?: string,
}

interface Person {
  name: string,
  job: JobInfo,
}

const developer: Person = {
  name: 'John Doe',
  job: {
    currentJob: 'Developer',
  }
}

const changeJob = R.curry(
  (newJob: string, job: JobInfo) => {
    return {
      currentJob: newJob,
      previousJob: job.currentJob,
    }
});

const designer: Person = R.evolve<{ job: (job: JobInfo) => JobInfo }, Person>({
  job: changeJob('Designer'),
}, developer);

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions