Skip to content

Rule proposal: Export all types used in exports #7670

Open
@JoshuaKGoldberg

Description

@JoshuaKGoldberg

Before You File a Proposal Please Confirm You Have Done The Following...

My proposal is suitable for this project

  • My proposal specifically checks TypeScript syntax, or it proposes a check that requires type information to be accurate.
  • My proposal is not a "formatting rule"; meaning it does not just enforce how code is formatted (whitespace, brace placement, etc).
  • I believe my proposal would be useful to the broader TypeScript community (meaning it is not a niche proposal).

Description

If a file exports a construct that relies on some other types, but doesn't export those other types, it can be difficult for other files to declare types based on the construct.

For example, suppose a ./somewhere file exports a doSomething function with a single parameter of type SomeSettings, but doesn't export SomeSettings. What if a consuming file wants to declare a local/parameter of that same SomeSettings type? There'd be no easy way to refer to SomeSettings.

import { doSomething } from "./somewhere";

export function callDoSomethingAndLog(settings: Parameters<typeof doSomething>[0]) {
  doSomething(settings);
  console.log("Done!");
}

I see this a lot in definitions for libraries. Example: saurabhnemade/react-twitter-embed#132

Fail Cases

interface SomeSettings {
  something: string;
}

export function something(settings: SomeSettings) {
  // ...
}

Pass Cases

export interface SomeSettings {
  something: string;
}

export function something(settings: SomeSettings) {
  // ...
}

Additional Info

...I could have sworn this was already filed somewhere, but I couldn't find it after a few minutes of searching. 🤷

Metadata

Metadata

Assignees

No one assigned

    Labels

    accepting prsGo ahead, send a pull request that resolves this issueenhancement: new plugin ruleNew rule request for eslint-pluginpackage: eslint-pluginIssues related to @typescript-eslint/eslint-plugin

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions