Skip to content

Provide Compiler API way to disable type checking for a source file #57015

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

Open
6 tasks done
wnayes opened this issue Jan 11, 2024 · 2 comments
Open
6 tasks done

Provide Compiler API way to disable type checking for a source file #57015

wnayes opened this issue Jan 11, 2024 · 2 comments
Labels
Awaiting More Feedback This means we'd like to hear from more people who would be helped by this feature Suggestion An idea for TypeScript

Comments

@wnayes
Copy link
Contributor

wnayes commented Jan 11, 2024

⭐ Suggestion

This request is for a public Compiler API means to disable type checking for individual SourceFile instances that are part of a ts.Program.

There are several ways to indirectly tap into this behavior, but none of them seem to be convenient to use from a Compiler API script.

  • A source file could have // @ts-nocheck explicitly written out.
  • Setting skipLibCheck / skipDefaultLibCheck will skip type checking for declaration source files.
  • JavaScript files under allowJs without checkJs I believe are another flavor of skipping type checking.

It would be nice if it was as simple as sourceFile.skipTypeChecking = true followed by requesting diagnostics. Or have the APIs accept a function (sourceFile: SourceFile) => boolean that is called to make the decision to type check or not.

📃 Motivating Example

I am trying to improve the compile performance of a very large TypeScript monorepo. This is on the scale of thousands of tsconfig.json files, and tens of thousands of source files.

Across the repository, source files have freely referenced each other. The tsconfig.json projects all extend from a common base and the purpose of them was mainly to just to light up IDE support and split out reasonably-sized chunks of source files to compile together.

As the codebase has grown over time, performance has plummeted under the default behavior of the compiler:

  • One tsconfig.json might "own" say 15 files, those within the subdirectory it is in.
  • The compiler parses those 15, then finds more dependencies, and more dependencies of those... and more dependencies of those.
  • Suddenly each ts.Program balloons into doing compilation work for thousands of transitive dependencies. That effort is unwanted, because those dependencies really should ideally just be checked when "their own" tsconfig.json is being compiled.

I know that Project References would be the best way to address this performance problem. We'd create strict project boundaries, and the "15 source files" in the example above would be type checked against .d.ts files rather than other full source files. It is a very large undertaking to take existing code that hasn't "followed the rules" and conform it though.

We already use the Compiler API for other reasons, and I've been experimenting with tweaks to ts.skipTypeChecking() to try to reduce the unwanted type checking work. It seems really promising to have skipTypeChecking short-circuit the type checking work for the transitive dependencies that pull into a ts.Program in my case.


I'd also note that a feature like this in the Compiler API could enable "power users" to implement something like #28260 on their own.


Finally, I'd note that I'm certainly open to other suggestions here, or any advice / caution about the skipTypeChecking trickery I'm delving into!

💻 Use Cases

What do you want to use this for?

  • A power user feature in the Compiler API to control what source files get type checked.

What shortcomings exist with current approaches?

What workarounds are you using in the meantime?

  • The most practical approach I have found to achieve an immediate widespread performance improvement is to patch the internal skipTypeChecking function with extra logic like if (sourceFile.skipTypeChecking) { return true; } and then set sourceFile.skipTypeChecking = true on the transitive dependency source files.

🔍 Search Terms

skipTypeChecking, ts-nocheck

✅ Viability Checklist

@RyanCavanaugh
Copy link
Member

Your scenario sounds like a use case for noResolve

@RyanCavanaugh RyanCavanaugh added Suggestion An idea for TypeScript Awaiting More Feedback This means we'd like to hear from more people who would be helped by this feature labels Jan 12, 2024
@wnayes
Copy link
Contributor Author

wnayes commented Jan 13, 2024

My understanding is that the current implementation of noResolve prevents inclusion of any SourceFiles that are outside of the project configuration. That does create a sort of boundary that is right for this scenario. But I haven't seen a practical use of this setting, because without those source files being part of the Program, there are errors any time types are imported and used in the remaining source files.

I would describe the high level desired behavior as "resolve other source files, but do as little work on them as possible."

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Awaiting More Feedback This means we'd like to hear from more people who would be helped by this feature Suggestion An idea for TypeScript
Projects
None yet
Development

No branches or pull requests

2 participants