Skip to content

Commit 26d9920

Browse files
authored
Fix false negative with require-valid-default-prop (#1469)
1 parent 8bdb2a9 commit 26d9920

File tree

2 files changed

+93
-2
lines changed

2 files changed

+93
-2
lines changed

lib/rules/require-valid-default-prop.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,11 @@ function getPropertyNode(obj, name) {
4949
}
5050

5151
/**
52-
* @param {Expression} node
52+
* @param {Expression} targetNode
5353
* @returns {string[]}
5454
*/
55-
function getTypes(node) {
55+
function getTypes(targetNode) {
56+
const node = utils.skipTSAsExpression(targetNode)
5657
if (node.type === 'Identifier') {
5758
return [node.name]
5859
} else if (node.type === 'ArrayExpression') {

tests/lib/rules/require-valid-default-prop.js

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,51 @@ ruleTester.run('require-valid-default-prop', rule, {
207207
}
208208
}`,
209209
parserOptions
210+
},
211+
{
212+
filename: 'test.vue',
213+
code: `export default Vue.extend({
214+
props: {
215+
foo: {
216+
type: Array as PropType<string[]>,
217+
default: () => []
218+
}
219+
}
220+
});
221+
`,
222+
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
223+
parser: require.resolve('@typescript-eslint/parser'),
224+
errors: errorMessage('function')
225+
},
226+
{
227+
filename: 'test.vue',
228+
code: `export default Vue.extend({
229+
props: {
230+
foo: {
231+
type: Object as PropType<{ [key: number]: number }>,
232+
default: () => {}
233+
}
234+
}
235+
});
236+
`,
237+
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
238+
parser: require.resolve('@typescript-eslint/parser'),
239+
errors: errorMessage('function')
240+
},
241+
{
242+
filename: 'test.vue',
243+
code: `export default Vue.extend({
244+
props: {
245+
foo: {
246+
type: Function as PropType<() => number>,
247+
default: () => 10
248+
}
249+
}
250+
});
251+
`,
252+
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
253+
parser: require.resolve('@typescript-eslint/parser'),
254+
errors: errorMessage('function')
210255
}
211256
],
212257

@@ -781,6 +826,51 @@ ruleTester.run('require-valid-default-prop', rule, {
781826
}`,
782827
parserOptions,
783828
errors: errorMessage('string')
829+
},
830+
{
831+
filename: 'test.vue',
832+
code: `export default Vue.extend({
833+
props: {
834+
foo: {
835+
type: Array as PropType<string[]>,
836+
default: []
837+
}
838+
}
839+
});
840+
`,
841+
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
842+
parser: require.resolve('@typescript-eslint/parser'),
843+
errors: errorMessage('function')
844+
},
845+
{
846+
filename: 'test.vue',
847+
code: `export default Vue.extend({
848+
props: {
849+
foo: {
850+
type: Object as PropType<{ [key: number]: number }>,
851+
default: {}
852+
}
853+
}
854+
});
855+
`,
856+
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
857+
parser: require.resolve('@typescript-eslint/parser'),
858+
errors: errorMessage('function')
859+
},
860+
{
861+
filename: 'test.vue',
862+
code: `export default Vue.extend({
863+
props: {
864+
foo: {
865+
type: Function as PropType<() => number>,
866+
default: 10
867+
}
868+
}
869+
});
870+
`,
871+
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
872+
parser: require.resolve('@typescript-eslint/parser'),
873+
errors: errorMessage('function')
784874
}
785875
]
786876
})

0 commit comments

Comments
 (0)