vuejs / eslint-plugin-vue

Official ESLint plugin for Vue.js
https://eslint.vuejs.org/
MIT License
4.47k stars 664 forks source link

`vue/require-default-prop` should not trigger when type is `x | undefined` without default value #2475

Open Aspyryan opened 5 months ago

Aspyryan commented 5 months ago

What rule do you want to change? vue/require-default-prop

Does this change cause the rule to produce more or fewer warnings? Is will provide less warnings if the type is already defined as undefined.

How will the change be implemented? (New option, new default behavior, etc.)? Could be an option to not throw the error / warning when props is not required and has a undefined type set

Please provide some example code that this change will affect:

const props = withDefaults(
  defineProps<{
    // Is not throwing warning because default is set
    modelValue?: string;
    // Should throw warning because no default is set
    label?: string;
    // Should not throw warning because undefined is allowed
    propertyName?: string | undefined;
  }>(),
  {
    modelValue: 'test',
  },
);

What does the rule currently do for this code? Throws a warning at the propertyName prop

What will the rule do after it's changed? Will not complain about the propertyName prop

Additional context If needed, I can look into it myself but I will need to be pointed to the correct files :)

FloEdelmann commented 5 months ago

Related to

FloEdelmann commented 5 months ago

I'm not sure if I agree; every optional property (with a ?) automatically has | undefined added to its type, so it would render the rule useless if every optional prop would not be required to have a default value then.

Aspyryan commented 5 months ago

Hmm yea I get that, is it typescript doing the automatic undefined? can we somehow disable that and then apply the rule?

FloEdelmann commented 5 months ago

Yes it is. I don't think we can turn that off.

higherorderfunctor commented 4 months ago

https://www.typescriptlang.org/tsconfig/#exactOptionalPropertyTypes

I'm using it in my projects to force an explicit undefined on optional properties where expected.

Not sure if it helps with this exact situation, but there is support in TS for it.

One of our dependencies requires it: https://github.com/Effect-TS/effect/tree/main/packages/schema#requirements.