Comments (10)
The built-in Partial doesn't work here as it does retain the keys of T but as "undefinable"
from type-fest.
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.
@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.
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.
@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.
No problem.
from type-fest.
@resynth1943 where do we go from here? want me to PR?
from type-fest.
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.
Could cast { ...curried, ...completed } as unknown as T
but that feels wrong
from type-fest.
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)
- Zero is not exported by ... HOT 1
- `And` and `Or` is not exported at `index.d.ts`
- ConditionalKeys does not correctly filter out `never` type HOT 3
- Paths<T> should handle recursive types
- `PickDeep` strips `null` HOT 7
- `schema` should properly set type of objects in arrays HOT 3
- `SimplifyDeep` doesn't deep simplify lists HOT 3
- `IsStringLiteral` should be `false` for branded and tagged types
- `CamelCasedPropertiesDeep` doesn't handle `Tagged` type correctly HOT 1
- `IfxxxLiteral` (eg `IfBooleanLiteral`) are missing (only the `IsxxxLiteral` is present
- `PartialDeep` doesn't work with arrays HOT 3
- Document `IntRange` `Start` param must be `>=0`
- `Exact` does not work as expected with type involving `Date` and union HOT 2
- Web-specific version of `StructuredCloneable` type HOT 10
- Add `IsNullable` and `IsOptional`
- `LiteralList<Union>` HOT 2
- Exact not function correctly with Dates since last commit HOT 8
- Type `{}` is not assignable to type `PartialDeep<T>` HOT 1
- Expose Max Recursion Depth of Paths HOT 2
- Issues with `Paths` type HOT 4
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from type-fest.