GithubHelp home page GithubHelp logo

Comments (10)

joeflateau avatar joeflateau commented on August 18, 2024

The built-in Partial doesn't work here as it does retain the keys of T but as "undefinable"

from type-fest.

WORMSS avatar WORMSS commented on August 18, 2024

Sorry, I am not super great with Types yet, so I am having trouble understanding this, but..

How does the function partial/curried know that {a:"foo"} should be a accepting IComplete?
Is it because bar and baz are of IComplete, so it infers backwards that curried must accept IComplete too? (Just not used to that way of thinking yet).

Also, Shouldn't curried also be able to accept properties that were passed into partial since they are only "defaults" ?? Because to me it would read that a would have to be omiitted?

So you couldn't do

const bar: IComplete = curried({b:"bar"});
const baz: IComplete = curried({a: "not foo", b:"baz"});

Or am I reading this wrong?

from type-fest.

resynth1943 avatar resynth1943 commented on August 18, 2024

@joeflateau Nice little riddle. I've solved it.

interface Complete {
    a: number;
    b: number;
}

function curried<PartialOne extends Partial<Complete>>(partialOne: PartialOne) {
    return function <PartialTwo extends Omit<Complete, keyof PartialOne>>(partialTwo: PartialTwo) {
        return { ...partialOne, ...partialTwo };
    }
}

const complete = curried({
    a: 2
})({
    b: 2
});

const completeCast: Complete = complete;

The trick is to not type the return type of the returned function from curried. It doesn't matter anyway, because as you can see, it's assignable to Complete.

Feel free to test this one yourself..

from type-fest.

resynth1943 avatar resynth1943 commented on August 18, 2024

Also, sorry for what's basically a bump, but I'm trying to hack away at the long-standing issues here. Hope I helped you anyway, despite the huge time gap. 😛

from type-fest.

joeflateau avatar joeflateau commented on August 18, 2024

@resynth1943 haha, no worries. I'm going to need a bit to wrap my head around your solution, but that's awesome

from type-fest.

resynth1943 avatar resynth1943 commented on August 18, 2024

No problem. ♥️ By the way, my solution stops you from passing the same key in both objects, and it's all typed correctly. It should be foolproof. 😛

from type-fest.

joeflateau avatar joeflateau commented on August 18, 2024

@resynth1943 where do we go from here? want me to PR?

from type-fest.

joeflateau avatar joeflateau commented on August 18, 2024

wrapping in a function to let a type be passed into the curry. still haven't figured out how to make the result of completed() return type T

interface Complete {
  a: number;
  b: number;
}

function curry<T>() {
  return function curried<Curried extends Partial<T>>(curried: Curried) {
    return function completed<Completed extends Omit<T, keyof Curried>>(
      completed: Completed
    ) {
      return { ...curried, ...completed };
    };
  };
}


const complete: Complete = curry<Complete>()({
  a: 1
})({
  b: 2
});

from type-fest.

joeflateau avatar joeflateau commented on August 18, 2024

Could cast { ...curried, ...completed } as unknown as T but that feels wrong

from type-fest.

WORMSS avatar WORMSS commented on August 18, 2024

Is this even possible? Because you couldn't pass return type of curried around. It would have to know the solidified value of curried argument to know what it is?
For example

const v = JSON.parse(API.get());
const a: ??? = curried<Completed>(v);
const c: Completed = a(somethingElse);

What would you write into a:???

from type-fest.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.