我想使用sequenceS函数,但它不能正确推断左类型。让我们考虑下面的代码:
declare function validateEmail(
email: string
): E.Either<EmailValidationError, Email>
declare function validateUsername(
username: string
): E.Either<UsernameValidationError, Email>
function validateData(inputs: {
email: string
username: string
}) {
return sequenceS(E.Apply)({
email: validateEmail(inputs.email),
username: validateUsername(inputs.username),
})
}
我得到以下错误:Type 'UsernameValidationError' is not assignable to type 'EmailValidationError'.
我知道我可以通过显式地指定类型来修复它,像这样:
function validateData(inputs: {email: string; username: string}) {
return sequenceS(E.Apply as apply.Apply2C<
'Either', UsernameValidationError | EmailValidationError
>)({
email: validateEmail(inputs.email),
username: validateUsername(inputs.username),
})
}
但这似乎不实用,尤其是用这种方式创建的大对象。我也可以使用点符号,但这仍然让我徘徊,如果我做了一些错误的序列使用。有没有一种方法可以告诉typescript自动推断左边的类型?
对于sequenceS
的定义,它期望Left
上具有固定类型的值。对于您的用例,您可以使用Do
符号。
function validateData(inputs: {
email: string
username: string
}) {
return pipe(
validateEmail(inputs.email),
E.bindTo('email'),
E.apSW('username', validateUsername(inputs.username),
)
}