From 47b9de0e8474e22a24f5f8fdbefe90c77342e7f8 Mon Sep 17 00:00:00 2001 From: waynzh Date: Mon, 3 Mar 2025 20:27:00 +0800 Subject: [PATCH] feat: handle generic parameter types --- lib/utils/ts-utils/ts-types.js | 12 ++++++++ tests/lib/rules/require-valid-default-prop.js | 30 +++++++++++++++++-- 2 files changed, 40 insertions(+), 2 deletions(-) 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() } ] })