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

Lib dependencies are transitive #37775

Open
astorije opened this issue Apr 3, 2020 · 2 comments
Open

Lib dependencies are transitive #37775

astorije opened this issue Apr 3, 2020 · 2 comments
Labels
In Discussion Not yet reached consensus Suggestion An idea for TypeScript

Comments

@astorije
Copy link

astorije commented Apr 3, 2020

TypeScript Version: 3.8.3

Search Terms: lib target dependencies triple-slash

Code

I have a reproduction repository at https://github.com/astorije/repro-tsc-lib-issue.
Essentially, consider the following code:

console.log(Object.values({ foo: BigInt(42) }));

Object.values is a ES2017 feature, and BigInt is a ES2020.
Also consider the target is tsconfig.json is es2015, and lib is either not specified or simply contains es2015 and dom.

Expected behavior:

Given the code and the TS configuration above, the type checker should always fails with:

index.ts:2:20 - error TS2339: Property 'values' does not exist on type 'ObjectConstructor'.

2 console.log(Object.values({ foo: BigInt(42) }));
                     ~~~~~~

index.ts:2:34 - error TS2304: Cannot find name 'BigInt'.

2 console.log(Object.values({ foo: BigInt(42) }));
                                   ~~~~~~

And if you only have typescript as a dependency in package.json, that is indeed what you'll get. So far, so good. See the expected folder of my repro repo.

Actual behavior:

If you have a (direct or indirect) dependency to @types/node, or if any dependency contains a declaration file that has /// <reference lib="es2018" />, /// <reference lib="es2020.bigint" />, etc., the type checker will now stop reporting these errors. See the actual folder of my repro repo.

This seems significant to me because it means that dependencies can silence potential browser incompatibilities. If I specified a target of es2015, with no extra lib, Babel transpiling, or polyfills, I should not be able to compile the code above.

Is there something obvious I'm missing? I realize it's the very design of libbut as explained in #15732, that assumes the project uses polyfills, which is not something that can be enforced/checked by a third-party library at compile time.

Related Issues:

Apologies for the vagueness of the search terms. It's significant enough that it must already exist in an issue or a StackOverflow question, but after spending some time looking, I did not find anything similar.

The only issues that seem somewhat related, but different:

@RyanCavanaugh RyanCavanaugh changed the title Dependencies referencing libs silence the checker Lib dependencies are transitive Apr 3, 2020
@RyanCavanaugh RyanCavanaugh added In Discussion Not yet reached consensus Suggestion An idea for TypeScript labels Apr 3, 2020
@larsrh
Copy link

larsrh commented Jun 3, 2020

I've posted this exact question on Stack Overflow the other day: https://stackoverflow.com/q/62087887/4776939

@pilaoda
Copy link

pilaoda commented Mar 7, 2023

Please consider provide config for user to override type reference.
For example in tsconfig.json:

        "compilerOptions": {
		"paths": {
			"@types/node": [
				"empty-types",
			]
		}
	},

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

4 participants