-
Notifications
You must be signed in to change notification settings - Fork 935
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
mixed.oneOf doesn't respect nullable #104
Comments
yes this confusing but expected. you have a contradiction between your schema on one hand you are saying its can only be 'apple' or 'banana' and on the other say it can also be |
I strongly think that nullable() should add the null to the oneOf constraint automatically. Sometimes you are reusing the options passed to oneOf for your dropdowns (for example) but you don't want a null option field added. I'm currently doing |
@jquense I could make the same argument for every schema definition that includes This boils down to a matter of semantics and expressing intent. I honestly wouldn't find it confusing at all to read yup.string().oneOf([ null, ...MY_VALUES ]); ...is bound to raise some eyebrows. |
I realize that yes this can be confusing or a bit odd. Much of the choices in yup straddle that line, because a lot fo this is is subjective and up to what you feel makes sense in terms of expectations. We can of course keep trying to hit the sweet spot fro the most people but somethings are always bound to raise eyebrows for some people. In this particular case I think the current behavior, while somewhat surprising, is the most flexible approach, and consistent with Joi's behavior so there is some precedent. |
Btw,
Is this also an expected behavior? |
@jquence Reading this thread helped me to understand the choices you made here. Perhaps we could update the docs for |
Agree with @fnky @aphillipo and @nfantone.
IIUC, So firstly, I don't see how the current behavior is the most flexible approach. Unless I'm overlooking something, it makes And secondly, it seems like changing the behavior won't hurt anyone. The way the current behavior (and apparently also Joi's behavior?) is, nobody would be combining these two. So these users (and consistently with Joi) can't be negatively affected by changing the combined behavior. |
I agree with @nfantone and @Philipp91. The current semantics are confusing and I don't think that consistency with Joi's behavior is a strong argument. If Joi's got it wrong, why not fix it? |
You can implement your own method with Yup.addMethod to handle this case :
Then, you can use it like this :
Finally, it works :
|
It seems that adding const fruits = ["banana", "apple"];
const schema = string().oneOf([...fruits, null]).nullable(); It can be tested here: https://runkit.com/zhouzi/5f2d264f20ab43001a495276 |
Ha ha, imagine how many dev hours you've wasted just by being stubborn and not handling this case automatically inside the library code.
Next person in this issue can increment the counter. |
Due to this non-obvious behavior, I cannot make a reusable description of the field. In a perfect world, I could do this:
And use this with native means as In the current implementation, I need to do crutches with passing parameters to my description. @jquense I think this issue should be open for further discussion. |
Here is the typing for @micktdj's import type {
MixedLocale, Ref
} from "yup";
declare module "yup" {
interface StringSchema<T, C> {
oneOfOptional<U extends T>(
arrayOfValues: ReadonlyArray<U | Ref>,
message?: MixedLocale["oneOf"],
): StringSchema<U | null | undefined, C>;
}
} |
Thank you filkalny-thimble |
I would add that // Some reusable yup
export const yesNoAnyYup = yup.mixed<YesNoAny>().oneOf(Object.values(YesNoAny));
// at usage time
yesNoAnyYup.nullable()
// Here there is nothing I can do unless I completely override the initial `oneOf()`,
// which break the LoD. Pleeease do something about it 🙏 |
In a standard form, there is no way for a user to enter My expected behavior when I add the This would make the behavior consistent to the In my opinion, this is certainly not a conflict of intention here, but an expectation of consistency in implementation between the different validation constraints I can place on a particular object. My particular implementation uses enums to determine the possible values and can be implemented as below
|
Here is how I did it
|
Note that if you do this, you must put
// This won't work
const schema = yup.string().oneOf(["a", "b", null]).nullable();
// This works
const schema = yup.string().nullable().oneOf(["a", "b", null]); |
The
mixed.oneOf
doesn't acceptnull
whennullable
is added.Example
Expected
It's expected to accept the value
null
whennullable
is set on the schema.The text was updated successfully, but these errors were encountered: