TypeScript 在检查使用更新版本的TS之前,缓存错误被错误地提升,

yvgpqqbh  于 6个月前  发布在  TypeScript
关注(0)|答案(3)|浏览(60)

🔎 搜索词

"不同版本的错误", "更改TS版本时的缓存错误", "较新tsserver的缓存错误", "旧的TS错误显示由运行较新TS的VSCode引起的"

🕗 版本与回归信息

  • 由于在TS版本之间切换时发生,我无法在之前的版本上进行测试

⏯ Playground链接

https://www.typescriptlang.org/play?noImplicitAny=false&ts=4.8.4#code/MYGwhgzhAECCA8AVAfNA3gWAFDV9AHgBQCU62eF0ATgKYAuArlQHbR0AWAljJHPGgQBc0CHSqdmAc2gBfZAG5yeGdiW4AnoXXDEpTFjWzsKg1mY0A7nBIA6IsRuaBFqgHspwgAyzi86AHp-Ni4YbmgwVhoqNypoCWgAVhsAJhToACMGOjiYZldsiOgomLjWABYbAA4bMqA

💻 代码

class A<T> {
    x() {
        return this as A<{ x: string }>;
    }

    y(y: T) {

    }
}

new A().x().y({ wrong: 0 }); // this is expected to be an error in 5.2.2 and expected to not be an error in 4.8.4

🙁 实际行为

首先,重要的是这个示例代码在4.8.4中是正确的,并且在5.2.2中正确地引发了错误。当你打开一个包含此代码的项目时,如果已安装TS 4.8.4,使用VSCode设置TypeScript版本为内部TS(在我的情况下为5.2.2)而不是工作区TS(4.8.4),编辑器将正确显示此文件中的错误。然而,当你从终端运行node_modules/.bin/tsc --noEmit时,它仍然输出相同的错误,尽管它本不应该。
我确保在使用node_modules/.bin/tsc -v在终端中运行TS 4.8.4时,TSC版本为4.8.4。
在4.8.4中,由于这段代码是有效的(使用noImplicitAny设置为false),无论你重复多少次tsc(4.8.4),都无法通过除更改文件外的方式使tsserver(5.2.2,由VSCode运行)的错误缓存失败。
即使你现在将VSCode使用的TS版本更改为工作区(4.8.4),在不更改问题文件的情况下,对该文件的错误仍然会在运行tsc时显示。
许多开发人员在MacOS和Windows上注意到了这种行为。

🙂 预期行为

使用tsc 4.8.4对代码进行类型检查不应引发来自tsserver 5.2.2的缓存错误,该服务器在检查该文件之前已对其进行了检查并引发了错误。
Playground链接显示相同的代码:

  • 在4.8.4中正确无误
  • 在5.2.2中正确有误
nukf8bse

nukf8bse1#

TS服务器不会将任何内容写入磁盘,或者至少不应该这样做,因此根据描述的这个错误在物理上是不可能发生的。
你能分享一个演示这种行为的仓库吗?

lxkprmvk

lxkprmvk2#

如果运行npm i(或等效程序),问题是否会消失?

inb24sb2

inb24sb23#

@RyanCavanaugh 哦,所以原因一定和我想象的完全不同,抱歉给大家带来了困惑;o 但事实是tsc 5.2.2从未被该用户运行过,只有tsserver在5.2.2中运行,然而tsc 4.8.4却引发了仅限于TypeScript 5.2.2的错误。这就是为什么我认为它肯定是一些缓存。
我无法分享这个发生问题的原始仓库,所以我会尝试准备一个包含这个问题的小仓库。然而,另一个问题是它不一致,几个开发人员都看到了(包括Mac和Win),但例如在我的个人电脑上根本没有发生过。但我会尽力而为,我们拭目以待,这个问题非常奇怪。
@craigphicks 我们没有尝试npm i。我们只是通过运行npm list typescript来确保仓库中只安装了TS 4.8.4,并且版本是正确的。我们的npm脚本确保指向node_modules/.bin/tsc,以避免在有人安装全局安装的TS时运行它,所以我们认为这不会有帮助。

相关问题