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

Node module dependencies that use a triple-slash directive to reference libs poison the global scope #33111

Open
AaronFriel opened this issue Aug 28, 2019 · 5 comments
Labels
In Discussion Not yet reached consensus Suggestion An idea for TypeScript

Comments

@AaronFriel
Copy link

AaronFriel commented Aug 28, 2019

TypeScript Version: 2.x, 3.x

Search Terms: lib.dom.d.ts pollutes global scope, name is defined as never, event is defined as Event | undefined

See: https://github.com/AaronFriel/is-test/blob/4e235decffdfd3c137ea066f8462d57d2fc8d0f2/src/index.ts at the commit hash linked.

Expected behavior:

Given a tsconfig.json with lib: [], I would expect the following code to fail to build due to $variable not defined errors:

import is from '@sindresorhus/is';

function main() {
  console.log(name);
  console.log(event);
  console.log(caches);
  console.log(applicationCache);
  console.log(parent);
}

Actual behavior:

See: https://github.com/AaronFriel/is-test/blob/master/src/index.ts for a particularly egregious example of this. It builds without any type errors. When running npm run start, it will throw a runtime error on the first console.log. If you remove that line, the next one fails, and so on, for the next 700+ lines.

General purpose libraries often need to be written to handle multiple versions of ES (ES5, ES6, ES7...) and multiple host environments (e.g.: DOM, ScriptHost, WebWorker). But right now they are faced with a choice:

A: Use a triple slash directive to import types that they use, and poison the user's global scope, causing nearly one thousand variable names to be silently accepted as defined without any type checker errors.

B: Remove the triple slash directives and require that users use the --skipLibCheck option or equivalent in their config file or include the required libs in their compiler options. Otherwise the library will fail to type check.

This is a choice that library authors would quite reasonably not want to make.

Potential solutions:

  1. Triple slash directives should import types only in dependencies.

    This seems tricky to implement, I think.

  2. There should be a types-only version of the major lib files, so that general-purpose utility packages can reference those instead.

    This seems less tricky: extract all the types from the dom lib a new dom-types lib, and use a directive to reference the types. Then, library authors can triple-slash reference dom-types and get only the types. Has the advantage of not causing any compatibility issues, and library authors can opt in to the types-only package.

  3. ???

@fatcerberus
Copy link

FWIW I don’t think --skipLibCheck prevents the types from being pulled in - it just stops the .d.ts files themselves from being type checked. That was my understanding, anyway.

@AaronFriel
Copy link
Author

@fatcerberus Yes, that's right, I started to comment and realized I wasn't quite clear with what my option B meant. I edited it to this:

B: Remove the triple slash directives and require that users use the --skipLibCheck option or equivalent in their config file or include the required libs in their compiler options. Otherwise the library will fail to type check.

It's removing the triple slash directive that was missing from my description. The dependency will build fine (tsc emits no errors as long as the libs are added to the compiler options), but unless a downstream consumer of the package uses --skipLibCheck (or includes the missing libs in their compiler options), their build will fail.

@nmain
Copy link

nmain commented Aug 28, 2019

If it was implemented and library authors followed suit, #31894 would handle this well.

@sandersn sandersn added In Discussion Not yet reached consensus Suggestion An idea for TypeScript labels Sep 3, 2019
@sandersn
Copy link
Member

sandersn commented Sep 3, 2019

@rbuckton hadn't you considered option (2), creating standalone versions of the built-in lib files?

@Georift
Copy link

Georift commented Nov 6, 2020

@rbuckton hadn't you considered option (2), creating standalone versions of the built-in lib files?

Do you have and updates on this? I don't know how prevalent this problem is in other packages, but we're butting up against it in @types/superagent now. (DefinitelyTyped/DefinitelyTyped#41425) If you have any guidance that'd be awesome 🙂

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
In Discussion Not yet reached consensus Suggestion An idea for TypeScript
Projects
None yet
Development

No branches or pull requests

5 participants