import { Schema } from "effect"
const UserId = Schema.Number.pipe(Schema.brand("UserId"))
type UserId = typeof UserId.Type
const UserStruct = Schema.Struct({
id: UserId,
age: Schema.Number
})
class UserClass extends Schema.Class<UserClass>("UserClass")({
id: UserId,
age: Schema.Int
}) {}
const UserClassFromStruct = UserStruct.pipe(Schema.transform(Schema.typeSchema(UserClass), {
encode: (decoded) => decoded,
decode: (encoded) => {
// I want to have branded types here
encoded.id satisfies UserId
return encoded
},
strict: true
}))
console.log(
// ' └─ Expected UserClass, actual {"id":1,"age":1}'
Schema.decodeEither(UserClassFromStruct)({ id: 1, age: 1 })
)
const UserClassFromStruct2 = UserStruct.pipe(Schema.transform(Schema.typeSchema(UserClass), {
encode: (decoded) => decoded,
decode: (encoded) => {
// I want to have branded types here
encoded.id satisfies UserId
return UserClass.make(encoded)
},
strict: true
}))
try {
Schema.decodeEither(UserClassFromStruct2)({ id: 1, age: 1.5 })
} catch (e) {
// This throws the ParseError from UserClass.make
// ' └─ Expected an integer, actual 1.5'
console.log("Thrown", e)
}
import { Schema } from "effect"
const UserId = Schema.Number.pipe(Schema.brand("UserId"))
type UserId = typeof UserId.Type
const UserStruct = Schema.Struct({
id: UserId,
age: Schema.Number
})
class UserClass extends Schema.Class<UserClass>("UserClass")({
id: UserId,
age: Schema.Int
}) {}
const UserClassFromStruct = UserStruct.pipe(Schema.transform(Schema.typeSchema(UserClass), {
encode: (decoded) => decoded,
decode: (encoded) => {
// I want to have branded types here
encoded.id satisfies UserId
return encoded
},
strict: true
}))
console.log(
// ' └─ Expected UserClass, actual {"id":1,"age":1}'
Schema.decodeEither(UserClassFromStruct)({ id: 1, age: 1 })
)
const UserClassFromStruct2 = UserStruct.pipe(Schema.transform(Schema.typeSchema(UserClass), {
encode: (decoded) => decoded,
decode: (encoded) => {
// I want to have branded types here
encoded.id satisfies UserId
return UserClass.make(encoded)
},
strict: true
}))
try {
Schema.decodeEither(UserClassFromStruct2)({ id: 1, age: 1.5 })
} catch (e) {
// This throws the ParseError from UserClass.make
// ' └─ Expected an integer, actual 1.5'
console.log("Thrown", e)
}