TypeScript Lib依赖是传递的

au9on6nz  于 10个月前  发布在  TypeScript
关注(0)|答案(2)|浏览(85)

TypeScript版本:3.8.3
搜索词:lib target dependencies triple-slash
代码
我在https://github.com/astorije/repro-tsc-lib-issue有一个复现仓库。
请考虑以下代码:

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

Object.values 是一个ES2017特性,而BigInt是一个ES2020特性。
还请考虑targettsconfig.json,es2015lib,而es2015dom要么没有指定,要么只包含它们。
预期行为:
给定上述代码和TS配置,类型检查器应该总是失败:

  1. index.ts:2:20 - error TS2339: Property 'values' does not exist on type 'ObjectConstructor'.
  2. 2 console.log(Object.values({ foo: BigInt(42) }));
  3. ~~~~~~
  4. index.ts:2:34 - error TS2304: Cannot find name 'BigInt'.
  5. 2 console.log(Object.values({ foo: BigInt(42) }));
  6. ~~~~~~

如果你只有typescript作为package.json的依赖项,那就是事实。目前为止,一切正常。查看我的复现仓库的expected文件夹。
实际行为:
如果你有一个(直接或间接)对@types/node的依赖,或者如果任何依赖项包含一个声明文件,该文件具有/// <reference lib="es2018" />/// <reference lib="es2020.bigint" />等,那么类型检查器现在将不再报告这些错误。查看我的复现仓库的actual文件夹。
这对我来说似乎很重要,因为这意味着依赖项可以消除潜在的浏览器不兼容性。如果我指定了一个targetes2015,没有额外的lib、Babel转换或polyfills,我应该无法编译上面的代码。
我是不是漏掉了什么显而易见的东西?我知道这是lib的设计,但正如在#15732中解释的那样,这假设项目使用polyfills,这是第三方库无法在编译时强制/检查的内容。
相关问题:
对于搜索词的模糊性表示歉意。这个问题非常重要,肯定已经存在于一个问题或StackOverflow问题中,但在花了一些时间查找后,我没有找到任何类似的问题。
唯一看起来有些相关的一些问题,但又有所不同:

hts6caw3

hts6caw31#

我前几天在Stack Overflow上发布了这个问题:https://stackoverflow.com/q/62087887/4776939

vptzau2j

vptzau2j2#

请考虑为用户提供配置以覆盖类型引用。
例如,在tsconfig.json中:

  1. "compilerOptions": {
  2. "paths": {
  3. "@types/node": [
  4. "empty-types",
  5. ]
  6. }
  7. },

相关问题