[Refactor/Chore] interface over type #21239

Closed
opened 2026-02-21 20:11:34 -05:00 by yindo · 0 comments
Owner

Originally created by @hyoban on GitHub (Dec 23, 2025).

Originally assigned to: @hyoban on GitHub.

Self Checks

  • I have read the Contributing Guide and Language Policy.
  • This is only for refactors or chores; if you would like to ask a question, please head to Discussions.
  • I have searched for existing issues search for existing issues, including closed ones.
  • I confirm that I am using English to submit this report, otherwise it will be closed.
  • 【中文用户 & Non English User】请使用英语提交,否则会被关闭 :)
  • Please do not modify this template :) and fill in all the required fields.

Description

Why interface

TypeScript https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#differences-between-type-aliases-and-interfaces

If you would like a heuristic, use interface until you need to use features from type.

typescript-eslint https://typescript-eslint.io/rules/consistent-type-definitions#why-is-the-default-interface

We generally recommend staying with the default, 'interface', to be stylistically consistent with the majority of TypeScript projects. If you strongly prefer 'type', that's fine too.

Anthony's ESLint config preset https://github.com/antfu/eslint-config/blob/cfb1a48fedc7aa8108a49d4b60bed6510fefe5bc/src/configs/typescript.ts#L139

extends makes TypeScript's type-check faster than using &.

We must disable ESLint when type cannot be used, as in #30055, where we want Declaration Merge.

Why type

No Declaration Merge https://www.totaltypescript.com/type-vs-interface-which-should-you-use
This causes bad type inference for Object.values. We have to use type with ESLint disabled.

Index Signatures
We have to add [key: string]: unknown for interface when casing

End

I would prefer to disable this rule, let the developers decide. But given that we already have it enabled and there is no compelling reason to switch to interface, I've chosen to leave it as is.

Motivation

No response

Additional Context

No response

Originally created by @hyoban on GitHub (Dec 23, 2025). Originally assigned to: @hyoban on GitHub. ### Self Checks - [x] I have read the [Contributing Guide](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) and [Language Policy](https://github.com/langgenius/dify/issues/1542). - [x] This is only for refactors or chores; if you would like to ask a question, please head to [Discussions](https://github.com/langgenius/dify/discussions/categories/general). - [x] I have searched for existing issues [search for existing issues](https://github.com/langgenius/dify/issues), including closed ones. - [x] I confirm that I am using English to submit this report, otherwise it will be closed. - [x] 【中文用户 & Non English User】请使用英语提交,否则会被关闭 :) - [x] Please do not modify this template :) and fill in all the required fields. ### Description **Why `interface`** TypeScript https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#differences-between-type-aliases-and-interfaces > If you would like a heuristic, use interface until you need to use features from type. typescript-eslint https://typescript-eslint.io/rules/consistent-type-definitions#why-is-the-default-interface > We generally recommend staying with the default, 'interface', to be stylistically consistent with the majority of TypeScript projects. If you strongly prefer 'type', that's fine too. Anthony's ESLint config preset https://github.com/antfu/eslint-config/blob/cfb1a48fedc7aa8108a49d4b60bed6510fefe5bc/src/configs/typescript.ts#L139 `extends` makes TypeScript's type-check faster than using `&`. We must disable ESLint when `type` cannot be used, as in #30055, where we want Declaration Merge. **Why `type`** No Declaration Merge https://www.totaltypescript.com/type-vs-interface-which-should-you-use This causes bad type inference for `Object.values`. We have to use `type` with ESLint disabled. Index Signatures We have to add `[key: string]: unknown` for interface when casing **End** I would prefer to disable this rule, let the developers decide. But given that we already have it enabled and there is no compelling reason to switch to `interface`, I've chosen to leave it as is. ### Motivation _No response_ ### Additional Context _No response_
yindo closed this issue 2026-02-21 20:11:34 -05:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: langgenius/dify#21239