typed-typings / npm-ramda

TypeScript's type definitions for Ramda
MIT License
384 stars 64 forks source link

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

Open bandreetto opened 5 years ago

bandreetto commented 5 years ago

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);