未初始化的变量可以解决 TypeScript 中的 strictNullChecks

uninitialized variable works around strictNullChecks in TypeScript

提问人:hymced 提问时间:10/28/2023 最后编辑:hymced 更新时间:10/29/2023 访问量:42

问:

请考虑以下 MRE:

let foo: string;
function test() {
  console.log(foo.trim())
}
test()

我正在使用 TSConfig 中的选项。 我预料到编译器会出现错误。 但我只在运行时得到一个:strictNullChecks'foo' is possibly 'undefined'

TypeError:无法读取 undefined 的属性(读取“trim”)

为什么 TSConfig 编译器不抱怨? 为什么我不需要将未初始化的变量键入为 ?string | undefined

这里也没有编译错误:

module1

export let foo: string;

module2

import { foo } from 'module1';
console.log(foo.trim());

我知道如何强制执行类型检查,但我的问题是为什么 TypeScript 不这样做,我认为这是他工作的一部分!undefined

编辑:正如@matthieu-riegler所注意到的,当变量未声明为顶级变量时,它的行为符合预期。但实际上,只有当变量在调用站点的同一“级别”声明时,它才会按预期运行,因为这也不会引发任何编译器错误:

function test() {
let foo: string;
  function test2() {
    console.log(foo.trim())
  }
}
test()
TypeScript 未定义的 StrictNullChecks

评论


答:

1赞 Matthieu Riegler 10/28/2023 #1

在 Typescript 存储库上有一个未解决的问题。

这个问题虽然很旧,但最近在一次设计会议上已经讨论过。

有一个开放的 PR tol 通过在使用变量但从未初始化时抛出错误来“修复”此问题。

此外,您可以注意到,这只是“顶级”变量的问题。let

评论

0赞 hymced 10/29/2023
有趣,谢谢!我更好地理解为什么它不容易解决......您是如何注意到这个问题仅适用于“顶级”和变量的?letvar
1赞 Matthieu Riegler 10/29/2023
我知道规则有效,所以你的复制品必须有一些具体的东西!
0赞 hymced 10/29/2023
查看我所做的编辑。这也很有趣 github.com/microsoft/TypeScript/issues/......