Provide Compiler API way to disable type checking for a source file #57015
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
Uh oh!
There was an error while loading. Please reload this page.
⭐ Suggestion
This request is for a public Compiler API means to disable type checking for individual
SourceFile
instances that are part of ats.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.
// @ts-nocheck
explicitly written out.skipLibCheck
/skipDefaultLibCheck
will skip type checking for declaration source files.allowJs
withoutcheckJs
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:
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 haveskipTypeChecking
short-circuit the type checking work for the transitive dependencies that pull into ats.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?
What shortcomings exist with current approaches?
// @ts-nocheck
dynamically feels extremely roundabout, and in particular has some bugs (Incremental compile can spend time type checking files with@ts-nocheck
#56956)skipLibCheck
is similar functionality, except I want to skip "a certain large swath of non-declaration files" instead.What workarounds are you using in the meantime?
skipTypeChecking
function with extra logic likeif (sourceFile.skipTypeChecking) { return true; }
and then setsourceFile.skipTypeChecking = true
on the transitive dependency source files.🔍 Search Terms
skipTypeChecking
,ts-nocheck
✅ Viability Checklist
The text was updated successfully, but these errors were encountered: