diff --git a/lib/rules/require-valid-default-prop.js b/lib/rules/require-valid-default-prop.js index ef9453b23..e40cad861 100644 --- a/lib/rules/require-valid-default-prop.js +++ b/lib/rules/require-valid-default-prop.js @@ -49,10 +49,11 @@ function getPropertyNode(obj, name) { } /** - * @param {Expression} node + * @param {Expression} targetNode * @returns {string[]} */ -function getTypes(node) { +function getTypes(targetNode) { + const node = utils.skipTSAsExpression(targetNode) if (node.type === 'Identifier') { return [node.name] } else if (node.type === 'ArrayExpression') { diff --git a/tests/lib/rules/require-valid-default-prop.js b/tests/lib/rules/require-valid-default-prop.js index 58adccadf..836f06d5c 100644 --- a/tests/lib/rules/require-valid-default-prop.js +++ b/tests/lib/rules/require-valid-default-prop.js @@ -207,6 +207,51 @@ ruleTester.run('require-valid-default-prop', rule, { } }`, parserOptions + }, + { + filename: 'test.vue', + code: `export default Vue.extend({ + props: { + foo: { + type: Array as PropType, + default: () => [] + } + } + }); + `, + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, + parser: require.resolve('@typescript-eslint/parser'), + errors: errorMessage('function') + }, + { + filename: 'test.vue', + code: `export default Vue.extend({ + props: { + foo: { + type: Object as PropType<{ [key: number]: number }>, + default: () => {} + } + } + }); + `, + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, + parser: require.resolve('@typescript-eslint/parser'), + errors: errorMessage('function') + }, + { + filename: 'test.vue', + code: `export default Vue.extend({ + props: { + foo: { + type: Function as PropType<() => number>, + default: () => 10 + } + } + }); + `, + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, + parser: require.resolve('@typescript-eslint/parser'), + errors: errorMessage('function') } ], @@ -781,6 +826,51 @@ ruleTester.run('require-valid-default-prop', rule, { }`, parserOptions, errors: errorMessage('string') + }, + { + filename: 'test.vue', + code: `export default Vue.extend({ + props: { + foo: { + type: Array as PropType, + default: [] + } + } + }); + `, + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, + parser: require.resolve('@typescript-eslint/parser'), + errors: errorMessage('function') + }, + { + filename: 'test.vue', + code: `export default Vue.extend({ + props: { + foo: { + type: Object as PropType<{ [key: number]: number }>, + default: {} + } + } + }); + `, + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, + parser: require.resolve('@typescript-eslint/parser'), + errors: errorMessage('function') + }, + { + filename: 'test.vue', + code: `export default Vue.extend({ + props: { + foo: { + type: Function as PropType<() => number>, + default: 10 + } + } + }); + `, + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, + parser: require.resolve('@typescript-eslint/parser'), + errors: errorMessage('function') } ] })