diff --git a/lib/rules/require-explicit-slots.js b/lib/rules/require-explicit-slots.js
index 0ae77b597..bde61081a 100644
--- a/lib/rules/require-explicit-slots.js
+++ b/lib/rules/require-explicit-slots.js
@@ -5,6 +5,7 @@
'use strict'
const utils = require('../utils')
+const { getComponentPropsFromTypeDefine } = require('../utils/ts-utils')
/**
* @typedef {import('@typescript-eslint/types').TSESTree.TypeNode} TypeNode
@@ -95,6 +96,32 @@ module.exports = {
slotsDefined.add(slotName)
}
}
+ } else if (
+ param.type === 'TSTypeReference' &&
+ param.typeName.type === 'Identifier'
+ ) {
+ const componentPropsFromTypeDefine =
+ getComponentPropsFromTypeDefine(context, typeArguments?.params[0])
+
+ for (const memberNode of componentPropsFromTypeDefine) {
+ const slotName = memberNode.propName
+
+ if (!slotName || !memberNode.node) {
+ continue
+ }
+
+ if (slotsDefined.has(slotName)) {
+ context.report({
+ node: memberNode.node,
+ messageId: 'alreadyDefinedSlot',
+ data: {
+ slotName
+ }
+ })
+ } else {
+ slotsDefined.add(slotName)
+ }
+ }
}
}
}),
diff --git a/tests/lib/rules/require-explicit-slots.js b/tests/lib/rules/require-explicit-slots.js
index ebbc28818..3129b587e 100644
--- a/tests/lib/rules/require-explicit-slots.js
+++ b/tests/lib/rules/require-explicit-slots.js
@@ -160,6 +160,36 @@ tester.run('require-explicit-slots', rule, {
parser: null
}
}
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+
+
+ `
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+
+
+ `
}
],
invalid: [
@@ -333,6 +363,55 @@ tester.run('require-explicit-slots', rule, {
message: 'Slot foo is already defined.'
}
]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+
+
+ `,
+ errors: [
+ {
+ message: 'Slot default is already defined.'
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+
+
+ `,
+ errors: [
+ {
+ message: 'Slot default is already defined.'
+ },
+ {
+ message: 'Slot foo is already defined.'
+ }
+ ]
}
]
})