Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Set up @typescript-eslint/consistent-type-definitions rule to ban interface keyword #23442

Closed
1 of 9 tasks
MajorLift opened this issue Mar 12, 2024 · 0 comments · Fixed by #23439
Closed
1 of 9 tasks
Assignees
Labels
release-11.14.0 Issue or pull request that will be included in release 11.14.0 team-wallet-framework

Comments

@MajorLift
Copy link
Contributor

What is this about?

interface usage is banned in MetaMask codebases. With TypeScript conversion efforts in progress, it's time to enforce type usage over interface in the extension codebase as well, especially for new contributions in TypeScript.

There are a few reasons for banning interface:

  • Interfaces do not extend Record or have a string index signature by default, making them incompatible with the data/state objects we use.
  • The feature set of type aliases is a strict superset of that of interfaces (including extends, implements).
    • Declaration merging is an exception, but this is not a practice we want to encourage.

For more context, see these links for previous discussions on this topic:

Scenario

No response

Design

No response

Technical Details

No response

Threat Modeling Framework

No response

Acceptance Criteria

No response

Stakeholder review needed before the work gets merged

  • Engineering (needed in most cases)
  • Design
  • Product
  • QA (automation tests are required to pass before merging PRs but not all changes are covered by automation tests - please review if QA is needed beyond automation tests)
  • Security
  • Legal
  • Marketing
  • Management (please specify)
  • Other (please specify)

References

No response

@MajorLift MajorLift self-assigned this Mar 12, 2024
MajorLift added a commit that referenced this issue Mar 14, 2024
…eslint/consistent-type-definitions` rule (#23439)

## **Description**

### Motivation

`interface` usage is banned in MetaMask codebases. With TypeScript
conversion efforts in progress, it's time to enforce `type` usage over
`interface` in the extension codebase as well, especially for new
contributions in TypeScript.

There are a few reasons for banning `interface`:
- Interfaces do not extend `Record` or have a `string` index signature
by default, making them incompatible with the data/state objects we use.
- The feature set of type aliases is a strict superset of that of
interfaces (including `extends`, `implements`).
- Declaration merging is an exception, but this is not a practice we
want to encourage.

For more context, see these links for previous discussions on this
topic:
- MetaMask/eslint-config#216
- MetaMask/core#1933

### Explanation

The `@typescript-eslint/consistent-type-definitions` has been configured
with the `["error", "type"]` options, which will prevent the `interface`
keyword from being introduced into the codebase in the future.

Existing instances of `interface` usage in the codebase were converted
to type alias definitions.

For the following exceptions, the `interface` keyword was preserved with
a `eslint-disable` directive, and a TODO comment was added for future
conversion.

1. If the `interface` is declared with an `extends` keyword.
- This is because of possible type accuracy issues with the eslint
autofix appending the extending interface as an intersection (`&`).
2. If the `interface` is used for declaration merging. 
- This is the only use case for interfaces that is not supported by type
aliases, and is therefore a valid exception to the ESLint rule.

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/23439?quickstart=1)

## **Related issues**

- Closes #23442

## **Manual testing steps**

## **Screenshots/Recordings**

## **Pre-merge author checklist**

- [x] I’ve followed [MetaMask Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've clearly explained what problem this PR is solving and how it
is solved.
- [x] I've linked related issues
- [ ] I've included manual testing steps
- [ ] I've included screenshots/recordings if applicable
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.
- [x] I’ve properly set the pull request status:
  - [x] In case it's not yet "ready for review", I've set it to "draft".
- [x] In case it's "ready for review", I've changed it from "draft" to
"non-draft".

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.
@metamaskbot metamaskbot added the release-11.14.0 Issue or pull request that will be included in release 11.14.0 label Mar 14, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
release-11.14.0 Issue or pull request that will be included in release 11.14.0 team-wallet-framework
Projects
None yet
2 participants