diff --git a/lib/utils/ts-utils/ts-types.js b/lib/utils/ts-utils/ts-types.js index 2fe354c2c..7280c8762 100644 --- a/lib/utils/ts-utils/ts-types.js +++ b/lib/utils/ts-utils/ts-types.js @@ -202,6 +202,18 @@ function inferRuntimeTypeInternal(type, services) { const { checker } = services /** @type {Set} */ const types = new Set() + + // handle generic parameter types + if (type.isTypeParameter()) { + const constraint = type.getConstraint() + if (constraint) { + for (const t of inferRuntimeTypeInternal(constraint, services)) { + types.add(t) + } + } + return [...types] + } + for (const targetType of iterateTypes(checker.getNonNullableType(type))) { if ( isAny(targetType) || diff --git a/tests/lib/rules/require-valid-default-prop.js b/tests/lib/rules/require-valid-default-prop.js index a724d36f7..103b6b7d3 100644 --- a/tests/lib/rules/require-valid-default-prop.js +++ b/tests/lib/rules/require-valid-default-prop.js @@ -222,8 +222,7 @@ ruleTester.run('require-valid-default-prop', rule, { `, languageOptions: { parser: require('@typescript-eslint/parser'), - ecmaVersion: 6, - sourceType: 'module' + ...languageOptions } }, { @@ -332,6 +331,17 @@ ruleTester.run('require-valid-default-prop', rule, { languageOptions: { parser: require('vue-eslint-parser') } + }, + { + // https://github.com/vuejs/eslint-plugin-vue/issues/2692 + filename: 'test.vue', + code: ` + + `, + ...getTypeScriptFixtureTestOptions() } ], @@ -1201,6 +1211,22 @@ ruleTester.run('require-valid-default-prop', rule, { line: 3 } ] + }, + { + filename: 'test.vue', + code: ` + + `, + errors: [ + { + message: "Type of the default value for 'foo' prop must be a string.", + line: 4 + } + ], + ...getTypeScriptFixtureTestOptions() } ] })