-
-
Notifications
You must be signed in to change notification settings - Fork 538
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Proposal: Partial/Complete (curry) #39
Comments
The built-in Partial doesn't work here as it does retain the keys of T but as "undefinable" |
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 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? |
@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 |
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. 😛 |
@resynth1943 haha, no worries. I'm going to need a bit to wrap my head around your solution, but that's awesome |
No problem. |
@resynth1943 where do we go from here? want me to PR? |
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
|
Could cast |
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? const v = JSON.parse(API.get());
const a: ??? = curried<Completed>(v);
const c: Completed = a(somethingElse); What would you write into a:??? |
This may be a limitation in the type system, but thought I'd drop this proposal here. The idea here is that there should be some way of expressing that P is an object with keys that are a subset of the keys of T, then those keys that are missing on P from T are required to be supplied as U.
Upvote & Fund
The text was updated successfully, but these errors were encountered: