❓ Question
My current understanding
After reading the documentation, I understood that we can use Decoder.struct to convert a Form to, I could say, a FormValidated as below:
import * as D from "io-ts/Decoder"
type Form = {
foo: string
bar: number
}
type FormValidated = {
foo: NonEmptyString
bar: 0 | 1
}
const formDecoder = D.struct({
foo: /* Decoder to parse it */,
bar: /* Decoder to parse it */
})
Desired Behavior
My question is if there is a way to do the same thing for a type with a different structure. It's common here in the project I work on that we have a type that the backend expects and its structure isn't the same as the form. For example, can I convert Form to MyType in this example:
type Form = {
foo: string
bar: number
}
type MyType = {
foobar: NonEmptyString
barbaz: 0 | 1
}
I see that I can use Decoder.struct to parse the form to an intermediary type (this would be the FormValidated) and then use Decoder.map to construct MyType, but is there a way to do that directly?
Suggested Solution
I implemented a function to achieve that, the way I use it is:
import * as D from "io-ts/Decoder"
import * as DH from "./decoder-helper"
type Form = {
foo: string
bar: number
}
type MyType = {
foobar: NonEmptyString
barbaz: 0 | 1
}
const formDecoder = DH.top<Form, MyType>({
foobar: DH.lift("foo", /* Decoder to parse it */),
barbaz: DH.lift("bar", /* Decoder to parse it */)
})
This way I can convert Form directly to MyType without needing to convert it to an intermediary type.
My function is a bit complex, that's why I'm asking if there is already a way to do that.
Who does this impact? Who is this for?
This would benefit everyone that is using this library as a form decoder or even to decode JSON that has a different structure than the target type
Describe alternatives you've considered
Decoder.struct + Decoder.map
Additional context
I was inspired by this elm package
Your environment
| Software |
Version(s) |
| io-ts |
^2.2.21 |
| fp-ts |
^2.12.1 |
| TypeScript |
^5.1 |
❓ Question
My current understanding
After reading the documentation, I understood that we can use
Decoder.structto convert aFormto, I could say, aFormValidatedas below:Desired Behavior
My question is if there is a way to do the same thing for a type with a different structure. It's common here in the project I work on that we have a type that the backend expects and its structure isn't the same as the form. For example, can I convert
FormtoMyTypein this example:I see that I can use
Decoder.structto parse the form to an intermediary type (this would be theFormValidated) and then useDecoder.mapto constructMyType, but is there a way to do that directly?Suggested Solution
I implemented a function to achieve that, the way I use it is:
This way I can convert
Formdirectly toMyTypewithout needing to convert it to an intermediary type.My function is a bit complex, that's why I'm asking if there is already a way to do that.
Who does this impact? Who is this for?
This would benefit everyone that is using this library as a form decoder or even to decode JSON that has a different structure than the target type
Describe alternatives you've considered
Decoder.struct+Decoder.mapAdditional context
I was inspired by this elm package
Your environment