xxxx/xxxx.d.ts
文件并且遇到了问题。xxxx/xxxx.d.ts
。今天,由于@type/superagent 上的错误,我的构建开始失败。 我开始降低版本号,直到我发现问题从版本 2.0.34 开始。 在此之前,Typescript 编译器不会产生任何错误(使用版本 2.1.0-dev.20161017)
使用@types/ [email protected]的错误是:
node_modules/@types/superagent/index.d.ts(79,12):错误 TS2304:找不到名称“XMLHttpRequest”。
而@types/ [email protected]的错误是:
node_modules/@types/superagent/index.d.ts(79,12):错误 TS2304:找不到名称“XMLHttpRequest”。
我希望这些信息对你们有帮助。
你对 tsc 使用--lib dom
选项吗?
不,我没有。 而且我不确定这是否有帮助,但实际上我的直接依赖是超级测试。 我用它来单元测试服务器端代码。
@vvakame — 在 $#$ tsconfig.json
$#$ 中将"dom"
添加到我的compilerOptions.lib
数组中就可以了。 这似乎有点违反直觉。 这应该是预期的行为还是只是一个临时的解决方法?
免责声明:我不是超级代理用户。
我认为这是预期的行为。
https://www.npmjs.com/package/superagent
优雅且功能丰富的浏览器/节点 HTTP 与流畅的 API
解决问题。
interface XMLHttpRequest {}
将"dom"
添加到tsconfig.json
的唯一问题是我的文件中没有lib
部分,现在我有了它,我需要包含默认情况下其他库,如"es2016"
。
也许有一种自动化的方法来解决这个问题? 哪个不需要修改tsconfig.json
?
将["dom", "es2017"]
添加到 lib 修复了此问题。
我在 tsconfig.json 中添加“dom”的唯一问题是我正在编写服务器端代码。 因此,添加该库对我来说没有任何意义。 XMLHttpRequest 未随 Node.js 提供,并且 superagent 包没有在 Node.js 上抛出错误。 我认为问题在于@typings包没有有条件地使用 XMLHttpRequest。 如果包在 Node.js 和浏览器上运行良好, @typings也应该运行良好。
今天也遇到了这个问题。 如果我们不能有条件地提供/排除某些类型,我们是否应该考虑提供这些类型的两个版本供 node 和 dom 使用?
您可以添加包含以下内容的 superagent.d.ts 文件:
// error TS2304: Cannot find name 'XMLHttpRequest'
declare interface XMLHttpRequest {}
// error TS2304: Cannot find name 'Blob'
declare interface Blob {}
@vvakame对于为节点或DOM 设计的库在两种环境中都需要输入,这真的不是“预期行为”。 使用这个库需要人们添加很容易导致错误的类型,因为在 node.js 中访问浏览器全局变量时不会看到编译器警告。
我们也在https://github.com/strongloop/loopback-next中被这个问题所困扰。 通过添加dom
lib,全局命名空间突然被 Node.js 中不存在的类型如Request
污染
我们正在编写 HTTP 服务器堆栈,所以我们通常使用import {ServerRequest as Request} from 'http'
。 但是,当此行被意外省略,或者ServerRequest
没有别名为Request
时,TypeScript 会愉快地编译我们的代码,并且只会在运行时发现错误。 换句话说,TypeScript 不再能够在编译时捕获错误,这违背了目的。
我刚刚开始一个新项目,我想我会很聪明,通过从 supertest 切换到 chai-http 来解决这个问题,但是 chai-http 使用 @types/supertest。 -_-
我们会,这是一种解决方法: https ://github.com/jwalton/node-supertest-fetch
对此有任何更新还是不会有修复? 我认为@zephyrec说得最好,很多人都将它用于服务器端(即节点)。
对此有何更新?
一个简单的解决方法是使用不同的 typescript 配置来运行扩展您的原始文件并对其进行调整的测试。 所以你创建文件tsconfig.test.json
:
{
"extends": "./tsconfig.prod.json",
"compilerOptions": {
"lib": ["dom", "..."] // supertest requires dom for type definitions to work
}
}
(或者你可以设置编译器标志skipLibCheck:true
而不是调整库,这将跳过所有node_modules
的类型检查)
如果你使用ts-jest
你可以告诉它使用你的配置
"jest": {
"globals": {
"ts-jest": {
"tsConfig": "tsconfig.test.json"
}
}
}
这样您就不会在常规代码中牺牲类型安全,这绝对是不行的(在这样做之前我会立即放弃 supertest)。
https://github.com/DefinitelyTyped/DefinitelyTyped/pull/33517修复了这个问题,但 PR 被错误合并阻止
chai-http depends on superagent but has a lower required TypeScript version
我将此解释为意味着 @types/superagent 无法将其 TypeScript 要求更新为 3.0+,直到所有依赖于 @types/superagent 的@types包也将其 TypeScript 要求更新为 3.0+。 对我来说,这似乎是@types系统中的一个缺陷,因为它将我的 TypeScript 版本与所有依赖我的东西中最旧的 TypeScript 版本挂钩。
有没有人能够确认我对该错误消息的理解,如果是的话,有什么办法可以解决吗?
由于没有像该 PR 中更好的永久修复,我在我的应用程序中解决了这个问题,如下所示:
/// <reference lib="dom" />
import request = require('supertest');
该“三斜杠”lib 指令将在 TypeScript 3.0+ 版中工作。
从这个问题开始到现在已经快 2.5 年了! 我们怎样才能解决这个问题。
FWIW,当您启用 TypeScript 的编译器选项skipLibCheck
时,问题就消失了。
启用skipLibCheck
后,TypeScript 将不会检查任何.d.ts
文件 - 既来自@types/superagent
等依赖项,也包括您项目中可能拥有的任何.d.ts
文件。 你可以从你的库中删除dom
并且编译器不会再抱怨了。
作为一个很好的副作用, skipLibCheck
通常也会显着提高构建速度。
@bajtos这会使您容易出错,因为它会降低类型安全性。
lib: [ "es6" ]
工作target: "es2016+"
也为我工作@G-Rath 除非我误解,skipLibCheck 不会降低代码的类型安全性,只会降低 d.ts 文件的类型安全性,其中大部分可能是节点模块的一部分,而不是你的代码。
关于skipLibCheck,这不是IMO可行的解决方法。 来自https://stackoverflow.com/questions/52311779/usage-of-the-typescript-compiler-argument-skiplibcheck “取决于错误是什么,编译器可能会以导致代码其他地方出现问题的方式从错误中恢复不被注意(例如,通过将错误类型替换为 any),因此抑制类型错误(无论是通过 --skipLibCheck、//@ts-ignore 还是任何其他方式)都是一种冒险的做法”
@carnesen你打赌我 - 这正是我要引用的 stackoverflow 问题:joy:
@rjmunro你去吧😃
它不像// @ts-ignore
那样糟糕,但是任何抑制类型错误的东西,无论多么罕见,在技术上都会削弱代码的类型安全性,特别是因为你的node_modules
文件夹是由.d.ts
组成的TS 用来键入所有内容的
我认为最干净的解决方案确实是@carnesen 的 PR # 33517 ,它添加了dom
库作为对superagent
类型定义的外部引用,因为对Blob
和XMLHttpRequest
的引用superagent
类型定义需要XMLHttpRequest
,但它的实现不需要,这取决于它的使用方式(_browser vs node_)。
唯一真正的缺点是 lib 引用需要大约 9 个月前发布的 typescript 版本 3.0.0。
我不确定这是否只会影响 chai-http (请参阅Travis-CI )或者是否有其他依赖项需要将其打字稿版本提升到 3.0.0
任何更新? 又是2个月后...
阅读完所有这些后,当前可用的最干净的解决方案来自@carnesen ,但对我不起作用:-(
/// <reference lib="dom" />
import request = require('supertest');
我还检查了他的 PR(https://github.com/DefinitelyTyped/DefinitelyTyped/pull/33517),但 TravisCI 错误没有意义,因为chai-http
不需要低于 3.0 的 TS 版本...
我对 TypeScript 很陌生,所以如果我做错了什么,请告诉我。 我刚刚提交了与@carnesen在新 PR 中所做的完全相同的代码,以深入挖掘 Travis CI 日志(https://github.com/DefinitelyTyped/DefinitelyTyped/pull/36282)
编辑:
似乎chai-http
不再是问题了,但promisify-supertest
是......它看起来不是超级流行的废弃包(https://github.com/ariporad/promisify-supertest/blob /master/test/index.js)
更新这个的过程是什么?
编辑2:
我深入挖掘,发现需要更新以下类型定义:
// 错误 TS2304:找不到名称“XMLHttpRequest”
声明接口 XMLHttpRequest {}
// 错误 TS2304:找不到名称“Blob”
声明接口 Blob {}
@JasonKleban这个文件在哪里? 在node_modules
> superagent
? 我一直在想办法解决这个问题,但我束手无策。
@mikeyamato - 我不记得我在哪里成功使用它,但不是在 node_modules 中,因为您自己不管理这些文件。 相反,它可能只是在您的其他源文件旁边。 我想你会先尝试的。 不用找了?
您还可以尝试使用 tsconfig.json 类型文件夹设置吗?
编辑:打开一个新问题来跟踪这个:#41425
随着#36282的合并,又出现了一个新问题。 在仅节点项目中使用 superagent 时,引入三斜杠指令
/// <reference lib="dom" />
导致 DOM 类型被透明地添加到项目中。 然而,由于这是一个仅限节点的项目,因此没有 DOM,因此代码如下
window.setTimeout()
应该会导致 TypeScript 错误。 由于 DOM 类型是静默包含的,因此情况并非如此,并且可能导致代码库中出现细微的错误。
有没有一种方法可以将仅节点或仅浏览器的类型包含到项目中,以便我们可以选择使用哪个?
具有依赖项的另一个副作用是dom
是它会阻止supertest
( superagent
) 在具有lib: webworker
的项目中使用,参考: https: //github.com/microsoft/TypeScript/issues/20595。 据我所知,这之前没有提到过。
$ npm i @types/ superagent@latest -D
应该做的伎俩!
最有用的评论
我在 tsconfig.json 中添加“dom”的唯一问题是我正在编写服务器端代码。 因此,添加该库对我来说没有任何意义。 XMLHttpRequest 未随 Node.js 提供,并且 superagent 包没有在 Node.js 上抛出错误。 我认为问题在于@typings包没有有条件地使用 XMLHttpRequest。 如果包在 Node.js 和浏览器上运行良好, @typings也应该运行良好。