diff --git a/src/script-setup/scope-analyzer.ts b/src/script-setup/scope-analyzer.ts
index e4f892a..1c078fa 100644
--- a/src/script-setup/scope-analyzer.ts
+++ b/src/script-setup/scope-analyzer.ts
@@ -205,6 +205,12 @@ function analyzeUsedInTemplateVariables(
variable.references.push(reference)
reference.resolved = variable
+
+ if (reference.isTypeReference) {
+ // @typescript-eslint/no-unused-vars treats type references at the same position as recursive references,
+ // so without this flag it will be marked as unused.
+ ;(variable as any).eslintUsed = true
+ }
}
function processVExpressionContainer(node: VExpressionContainer) {
diff --git a/test/fixtures/integrations/script-setup-with-typescript-eslint/no-unused-vars/.eslintrc.json b/test/fixtures/integrations/script-setup-with-typescript-eslint/no-unused-vars/.eslintrc.json
new file mode 100644
index 0000000..7592b0b
--- /dev/null
+++ b/test/fixtures/integrations/script-setup-with-typescript-eslint/no-unused-vars/.eslintrc.json
@@ -0,0 +1,5 @@
+{
+ "rules": {
+ "@typescript-eslint/no-unused-vars": "error"
+ }
+}
diff --git a/test/fixtures/integrations/script-setup-with-typescript-eslint/no-unused-vars/valid/type-def.vue b/test/fixtures/integrations/script-setup-with-typescript-eslint/no-unused-vars/valid/type-def.vue
new file mode 100644
index 0000000..ba631bf
--- /dev/null
+++ b/test/fixtures/integrations/script-setup-with-typescript-eslint/no-unused-vars/valid/type-def.vue
@@ -0,0 +1,14 @@
+
+
+
+
+
\ No newline at end of file