Skip to content

refactor(components): [input] use type-based definitions#23366

Merged
Dsaquel merged 13 commits into
devfrom
refactor/input-generics-comp
Jan 16, 2026
Merged

refactor(components): [input] use type-based definitions#23366
Dsaquel merged 13 commits into
devfrom
refactor/input-generics-comp

Conversation

@rzzf
Copy link
Copy Markdown
Member

@rzzf rzzf commented Jan 12, 2026

Try refactoring runtime declarations into type-based declarations.

rel #23172

Summary by CodeRabbit

  • New Features
    • Added placeholder attribute for the Input component.
    • Added word-limit-position attribute (values: "inside" or "outside", default "inside").
    • Model-modifier flags for lazy/number/trim are now presence-based (flags rather than booleans).
    • Default clear icon updated to a CircleClose icon.

✏️ Tip: You can customize this high-level summary in your review settings.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jan 12, 2026

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Jan 12, 2026

📝 Walkthrough

Walkthrough

Input component API and implementation updated: model-modifiers now use presence-based true flags; new placeholder and word-limit-position props added; public props typing replaced with an explicit InputProps interface; Vue component now uses withDefaults(defineProps<InputProps>(), ...) and new default values.

Changes

Cohort / File(s) Summary
Documentation
docs/en-US/component/input.md
Updated model-modifiers to { lazy?: true, number?: true, trim?: true }; added placeholder (string) and word-limit-position (`'inside'
Type definitions
packages/components/input/src/input.ts
Replaced ExtractPropTypes usage with explicit public InputProps interface; changed InputModelModifiers fields to literal true; added ComponentSize import; marked inputProps/inputEmits as deprecated for internal compatibility
Component implementation
packages/components/input/src/input.vue
Added markRaw and IconCircleClose import and set default clearIcon; switched to withDefaults(defineProps<InputProps>(), { ... }) and defineEmits<inputEmits>(); added new prop defaults (e.g., wordLimitPosition: 'inside', tabindex, validateEvent, inputStyle, rows) and adjusted typings/imports to use the new public interfaces

Sequence Diagram(s)

(No sequence diagram generated.)

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Suggested reviewers

  • Dsaquel
  • btea

Poem

🐰 I hopped through props and types with care,
Flags turned true and placeholders now share.
Limits tucked inside where they belong,
Generics and defaults sing a new song.
A little rabbit cheers — the input is fair!

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main change: refactoring the input component to use type-based definitions instead of runtime declarations.
Description check ✅ Passed The description is minimal but adequate, explaining the refactoring effort and referencing a related issue. However, it lacks detail about the specific changes and does not follow the provided template structure.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

🧹 Recent nitpick comments
packages/components/input/src/input.vue (1)

222-234: Consider adding the autosize default for consistency.

The runtime props define autosize with default: false, but it's not included in withDefaults. While the behavior is equivalent (both undefined and false are falsy), adding it would maintain parity with the runtime definition.

Suggested change
 const props = withDefaults(defineProps<InputProps>(), {
   disabled: undefined,
   modelValue: '',
   modelModifiers: () => ({}),
   type: 'text',
   autocomplete: 'off',
+  autosize: false,
   clearIcon: markRaw(IconCircleClose),
   wordLimitPosition: 'inside',
   tabindex: 0,
   validateEvent: true,
   inputStyle: () => ({}),
   rows: 2,
 })

📜 Recent review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8d3025f and 1d0d0ee.

📒 Files selected for processing (2)
  • packages/components/input/src/input.ts
  • packages/components/input/src/input.vue
🧰 Additional context used
🧬 Code graph analysis (1)
packages/components/input/src/input.ts (1)
packages/constants/size.ts (1)
  • ComponentSize (3-3)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (9)
  • GitHub Check: Build ubuntu-latest LTS
  • GitHub Check: Build windows-latest LTS
  • GitHub Check: Unit Test (Current)
  • GitHub Check: Unit Test (LTS)
  • GitHub Check: Unit Test (New)
  • GitHub Check: SSR rendering test
  • GitHub Check: Lint
  • GitHub Check: Coverage
  • GitHub Check: size-report
🔇 Additional comments (2)
packages/components/input/src/input.ts (1)

38-168: Well-structured type-based props interface.

The new InputProps interface is comprehensive, well-documented with JSDoc comments, and properly aligned with the runtime props definition. The type annotations for each property correctly match their runtime counterparts.

packages/components/input/src/input.vue (1)

163-183: LGTM - Correct imports and icon handling.

The markRaw import and its usage with IconCircleClose properly prevents Vue from making the imported component reactive, which addresses the previously flagged issue.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@pkg-pr-new
Copy link
Copy Markdown

pkg-pr-new Bot commented Jan 12, 2026

Open in StackBlitz

pnpm add https://pkg.pr.new/element-plus/element-plus@23366
npm i https://pkg.pr.new/element-plus/element-plus@23366
yarn add https://pkg.pr.new/element-plus/[email protected]

commit: 1d0d0ee

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jan 12, 2026

Size Change: +1.06 kB (+0.06%)

Total Size: 1.65 MB

Filename Size Change
./dist/element-plus/dist/index.full.js 489 kB +299 B (+0.06%)
./dist/element-plus/dist/index.full.min.js 321 kB +209 B (+0.07%)
./dist/element-plus/dist/index.full.min.mjs 316 kB +238 B (+0.08%)
./dist/element-plus/dist/index.full.mjs 480 kB +318 B (+0.07%)
ℹ️ View Unchanged
Filename Size
./dist/element-plus/dist/index.css 46.9 kB

compressed-size-action

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/components/input/src/input.vue (1)

426-438: Potential type mismatch: value reassigned from string to number.

On line 432, looseToNumber(value) returns a number, but value is typed as string. The reassignment value = looseToNumber(value) creates a type inconsistency that TypeScript may not catch due to implicit any. This could propagate incorrect types to emit calls on lines 465-466.

🔧 Suggested fix
 const formatValue = (value: string) => {
   const { trim, number } = props.modelModifiers
   if (trim) {
     value = value.trim()
   }
+  let result: string | number = value
   if (number) {
-    value = looseToNumber(value)
+    result = looseToNumber(value)
   }
   if (props.formatter && props.parser) {
-    value = props.parser(value)
+    result = props.parser(String(result))
   }
-  return value
+  return result
 }

Alternatively, update the function signature to return string | number explicitly.

🤖 Fix all issues with AI agents
In @packages/components/package.json:
- Around line 21-22: The package "vue-component-type-helpers" is currently
listed under "dependencies" but is type-only and should be moved to
"devDependencies"; remove the "vue-component-type-helpers": "catalog:" entry
from the "dependencies" object and add the same entry under the
"devDependencies" object in package.json (keeping the same version spec), so the
package is not bundled in production builds.
🧹 Nitpick comments (1)
packages/components/input/src/input.ts (1)

38-41: Minor wording issue in deprecation comment.

The deprecation message uses past tense. Consider using future tense for clarity.

📝 Suggested wording
 /**
- * @deprecated Removed after 3.0.0
+ * @deprecated Will be removed after 3.0.0
  */

Apply the same fix to the deprecation comments at lines 236 and 241.

📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 199700f and f025b45.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (6)
  • docs/en-US/component/input.md
  • packages/components/input/src/input.ts
  • packages/components/input/src/input.vue
  • packages/components/input/src/instance.ts
  • packages/components/package.json
  • pnpm-workspace.yaml
🧰 Additional context used
🧬 Code graph analysis (1)
packages/components/input/src/input.ts (1)
packages/constants/size.ts (1)
  • ComponentSize (3-3)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (10)
  • GitHub Check: Unit Test (New)
  • GitHub Check: Unit Test (Current)
  • GitHub Check: Unit Test (LTS)
  • GitHub Check: Build windows-latest LTS
  • GitHub Check: Build ubuntu-latest LTS
  • GitHub Check: Lint
  • GitHub Check: Coverage
  • GitHub Check: SSR rendering test
  • GitHub Check: size-report
  • GitHub Check: build
🔇 Additional comments (10)
packages/components/input/src/instance.ts (1)

1-6: LGTM!

The updated InputInstance type correctly combines ComponentInstance (for the full Vue instance) with ComponentExposed (for the defineExpose surface). This provides accurate typing for component refs.

docs/en-US/component/input.md (1)

124-124: LGTM!

The type change from boolean to true for model-modifiers accurately reflects Vue's v-model modifier behavior—modifiers are either present (true) or undefined, never explicitly false.

packages/components/input/src/input.vue (3)

163-167: LGTM!

The generic script setup pattern generic="M extends InputModelModifiers = InputModelModifiers" correctly parameterizes the component over model modifier types, enabling type-safe modifier handling.


224-237: LGTM!

The withDefaults pattern with InputProps<M> is well-structured. Default values are appropriate, and the generic type flows correctly through props and emits.


308-312: LGTM!

The explicit cast props.resize as CSSProperties['resize'] ensures type safety for the resize CSS property.

pnpm-workspace.yaml (1)

21-21: Inconsistent version pinning and potentially incorrect version.

This entry uses an exact version 3.2.2 while all other catalog entries use caret ranges (e.g., ^3.4.1, ^2.3.2). Additionally, 3.2.2 appears to be higher than the reported npm latest version 3.0.6. Verify the package version is correct and either adopt caret range consistency with the rest of the catalog or confirm this exact pinning is intentional for stability.

packages/components/input/src/input.ts (4)

12-18: LGTM!

The new imports are correctly added to support the type-based interface definitions.


20-24: LGTM!

Using true literal type instead of boolean is semantically correct for presence-based modifier flags that are either set (true) or absent.


261-300: LGTM!

The interface is well-structured with proper typing. The documented workaround for the TS2590 autocomplete union type issue is a reasonable trade-off.


302-322: No changes needed. The update:modelValue emit type is correctly defined as string | number. Although the modelValue prop accepts null | undefined, the component itself never emits these values—it only emits strings and numbers from user interactions. The prop accepting null | undefined is intentional, allowing external value updates from the parent, while the emit type correctly reflects only the values the component produces. The types are consistent with the implementation.

Likely an incorrect or invalid review comment.

Comment thread packages/components/package.json Outdated
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jan 12, 2026

Coverage Report

Status Category Percentage Covered / Total
🔵 Lines 85.45% 17884 / 20929
🔵 Statements 84.24% 18720 / 22221
🔵 Functions 84.04% 4826 / 5742
🔵 Branches 73.7% 10209 / 13852
File Coverage
File Stmts % Branch % Funcs % Lines Uncovered Lines
Changed Files
packages/components/input/src/input.ts 93.75% 100% 92.85% 93.75% 380
packages/components/input/src/input.vue 86.73% 79.08% 78.94% 87.64% 289, 298, 356-361, 361-367, 404, 404-409, 407-408, 457, 502, 505-506, 519, 534, 544, 580-583, 107, 140-142
Generated in workflow #663

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jan 12, 2026

🧪 Playground Preview: https://element-plus.run/?pr=23366
Please comment the example via this playground if needed.

@rzzf rzzf marked this pull request as draft January 12, 2026 05:51
@rzzf rzzf force-pushed the refactor/input-generics-comp branch from 3b95cc6 to 7132014 Compare January 12, 2026 06:44
@rzzf rzzf force-pushed the refactor/input-generics-comp branch from 7132014 to d10f49d Compare January 12, 2026 06:51
@rzzf rzzf marked this pull request as ready for review January 12, 2026 08:09
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
packages/components/input/src/input.ts (2)

377-377: Missing JSDoc description for rows prop.

The rows property lacks a @description JSDoc comment, unlike all other properties in this interface. Consider adding one for consistency:

📝 Suggested documentation
   autofocus?: boolean
+  /**
+   * @description number of rows for textarea
+   */
   rows?: number

399-402: Minor: Consider adding a clarifying comment for the eve parameter naming.

The commit message mentions renaming evt to eve. While this is consistent throughout the new InputEmits type, it's an unconventional abbreviation. A brief comment explaining the naming convention could help future contributors, or consider using the more standard evt or full event.

📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d10f49d and 3a8b691.

📒 Files selected for processing (1)
  • packages/components/input/src/input.ts
🧰 Additional context used
🧬 Code graph analysis (1)
packages/components/input/src/input.ts (1)
packages/constants/size.ts (1)
  • ComponentSize (3-3)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (8)
  • GitHub Check: size-report
  • GitHub Check: Unit Test (Current)
  • GitHub Check: Unit Test (New)
  • GitHub Check: Unit Test (LTS)
  • GitHub Check: Coverage
  • GitHub Check: Lint
  • GitHub Check: SSR rendering test
  • GitHub Check: Build ubuntu-latest LTS
🔇 Additional comments (6)
packages/components/input/src/input.ts (6)

12-18: LGTM!

The new imports (Component from Vue and ComponentSize from @element-plus/constants) are correctly added to support the new type-based InputProps interface definitions.


20-24: Good refinement of modifier types.

Using literal true instead of boolean is semantically correct for Vue's v-model modifiers — when a modifier is present, it's always true; when absent, the property is undefined. This aligns with Vue's actual behavior.

Note that this is technically a breaking type change for any consumers who previously typed these as boolean.


38-41: LGTM!

The deprecation notice follows standard JSDoc format and clearly communicates the timeline for removal. This maintains backward compatibility while signaling the transition to the new type-based API.


235-238: LGTM!

Consistent deprecation marking with inputProps.


240-243: LGTM!

Consistent deprecation marking with the other runtime definitions.


392-412: Verify the conditional typing logic for the input event.

The condition M extends { number: true; lazy?: undefined } for the input event seems potentially incorrect. The .lazy modifier affects when update:modelValue fires (on change instead of input), but the input event itself still fires and receives the value.

If the intent is that .number modifier converts the value to a number, then the input event should also receive string | number when .number is present, regardless of .lazy:

-  input: [
-    value: M extends { number: true; lazy?: undefined }
-      ? string | number
-      : string,
-  ]
+  input: [
+    value: M extends { number: true } ? string | number : string,
+  ]

Please verify the intended behavior with Vue's v-model modifier semantics. If the current logic is intentional (e.g., some internal implementation detail), consider adding a comment explaining why lazy affects the input event's type.

@rzzf rzzf force-pushed the refactor/input-generics-comp branch from 3a8b691 to 4227fb6 Compare January 12, 2026 14:02
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
packages/components/input/src/input.ts (1)

395-415: Consider the parameter naming convention.

The commit message indicates renaming evt to eve was intentional, but eve is an unconventional abbreviation that may cause confusion (it's also a common proper noun). Consider using standard conventions like evt, event, or e.

Also, update:modelValue (line 396) always allows string | number, while input and change use conditional types based on modifiers. For full consistency, consider whether update:modelValue should also be conditional:

'update:modelValue': [value: M extends { number: true } ? string | number : string]

However, keeping it as string | number may be intentional for flexibility in edge cases.

📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3a8b691 and 4227fb6.

📒 Files selected for processing (1)
  • packages/components/input/src/input.ts
🧰 Additional context used
🧬 Code graph analysis (1)
packages/components/input/src/input.ts (1)
packages/constants/size.ts (1)
  • ComponentSize (3-3)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (10)
  • GitHub Check: Coverage
  • GitHub Check: Build ubuntu-latest LTS
  • GitHub Check: size-report
  • GitHub Check: Lint
  • GitHub Check: Build windows-latest LTS
  • GitHub Check: Unit Test (New)
  • GitHub Check: SSR rendering test
  • GitHub Check: Unit Test (LTS)
  • GitHub Check: Unit Test (Current)
  • GitHub Check: build
🔇 Additional comments (6)
packages/components/input/src/input.ts (6)

12-18: LGTM!

The added imports (Component and ComponentSize) are correctly used in the new type-based InputProps interface for icon props and size prop respectively.


20-24: Good refinement with literal types.

Using true instead of boolean accurately represents Vue's v-model modifiers - they're either present (true) or absent (undefined), never explicitly false.


38-41: Clear deprecation notice.

The deprecation comment provides a clear timeline for removal. Consider adding migration guidance to the component documentation pointing users to the new InputProps<M> interface.


240-259: Deprecation notice is consistent.

The runtime emits are correctly marked for removal. The transition to the new type-based InputEmits<M> is well-structured.


261-393: Well-structured type-based interface.

The generic InputProps<M> interface provides clean type-safe definitions. Good documentation of the TS2590 workaround on line 306-308 for the autocomplete property.


397-401: Verify the conditional type logic for input event.

The condition M extends { number: true; lazy?: undefined } is non-trivial. Ensure this correctly captures the intended behavior:

  • With .number modifier only: emit string | number
  • With .number.lazy modifiers: emit string (since lazy defers to change event)
  • Without .number: emit string

Consider adding a TypeScript test or comment explaining this conditional type for future maintainers:

// When number modifier is active but lazy is not, input events emit parsed numbers.
// When lazy is also active, raw string is emitted since number parsing is deferred to change.

Comment thread packages/components/input/src/input.ts
Copy link
Copy Markdown
Member

@Dsaquel Dsaquel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The result looks good, just added some comments.

Comment thread packages/components/input/src/input.vue Outdated
Comment thread packages/element-plus/package.json Outdated
Comment thread packages/components/package.json Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@packages/components/input/src/input.vue`:
- Around line 224-236: The code uses markRaw for clearIcon in the props default
but markRaw is not imported, causing a build failure; add markRaw to the Vue
imports (the same import statement that provides defineProps/withDefaults or
other Vue helpers) so markRaw is available when setting clearIcon:
markRaw(IconCircleClose) in the props definition.
📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4227fb6 and 88a30d9.

📒 Files selected for processing (1)
  • packages/components/input/src/input.vue
🧰 Additional context used
🪛 GitHub Actions: 📦 Package Size Report
packages/components/input/src/input.vue

[error] 230-230: TS2304: Cannot find name 'markRaw'.

🪛 GitHub Actions: Publish PR Commit Pkg
packages/components/input/src/input.vue

[error] 230-230: Cannot find name 'markRaw'. TS2304. This typically indicates missing Vue 3 types or incorrect composition API imports.

🪛 GitHub Check: build
packages/components/input/src/input.vue

[failure] 230-230:
Cannot find name 'markRaw'.

🪛 GitHub Check: Build ubuntu-latest LTS
packages/components/input/src/input.vue

[failure] 230-230:
Cannot find name 'markRaw'.

🪛 GitHub Check: size-report
packages/components/input/src/input.vue

[failure] 230-230:
Cannot find name 'markRaw'.

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (7)
  • GitHub Check: Lint
  • GitHub Check: SSR rendering test
  • GitHub Check: Build windows-latest LTS
  • GitHub Check: Coverage
  • GitHub Check: Unit Test (LTS)
  • GitHub Check: Unit Test (Current)
  • GitHub Check: Unit Test (New)
🔇 Additional comments (6)
packages/components/input/src/input.vue (6)

163-167: LGTM!

The generic script setup syntax properly enables type-based definitions for the component with the InputModelModifiers constraint.


182-186: LGTM!

Icon imports are correctly aliased and used for the clear icon default and password visibility toggle.


214-215: LGTM!

Type imports properly support the new generic-based prop and emit definitions.


237-237: LGTM!

The emit definition correctly applies the generic type parameter for type-safe event emissions.


308-312: LGTM!

The explicit cast to CSSProperties['resize'] ensures proper typing for the CSS resize property.


426-438: Type consistency is properly handled by InputEmits generic.

The formatValue function parameter is typed as string, but looseToNumber(value) returns any (which may be a number), and this reassignment is intentional when the number modifier is active. The InputEmits<M> type correctly uses conditional typing to allow string | number values for the input and change events only when M extends { number: true }, ensuring type safety at the emit call sites.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

Comment thread packages/components/input/src/input.vue Outdated
@Dsaquel
Copy link
Copy Markdown
Member

Dsaquel commented Jan 14, 2026

According to CR review #23366 (comment), package.json and packages/components/package.json should have vue-component-type-helpers in devDep IMO.

@rzzf
Copy link
Copy Markdown
Member Author

rzzf commented Jan 14, 2026

According to CR review #23366 (comment), package.json and packages/components/package.json should have vue-component-type-helpers in devDep IMO.

You’re right. During testing, it didn’t take effect due to pnpm caching, so I added this dependency for them. After retesting, everything works well now.

Comment thread packages/components/input/src/input.ts Outdated
Comment thread packages/element-plus/package.json Outdated
@Dsaquel Dsaquel merged commit fcf8698 into dev Jan 16, 2026
18 of 19 checks passed
@Dsaquel Dsaquel deleted the refactor/input-generics-comp branch January 16, 2026 20:49
@github-actions
Copy link
Copy Markdown
Contributor

@rzzf Thanks for your contribution! ❤️

@element-bot element-bot mentioned this pull request Jan 30, 2026
3 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants