提问人:hymced 提问时间:10/28/2023 最后编辑:hymced 更新时间:10/29/2023 访问量:42
未初始化的变量可以解决 TypeScript 中的 strictNullChecks
uninitialized variable works around strictNullChecks in TypeScript
问:
请考虑以下 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()
答:
1赞
Matthieu Riegler
10/28/2023
#1
在 Typescript 存储库上有一个未解决的问题。
这个问题虽然很旧,但最近在一次设计会议上已经讨论过。
有一个开放的 PR tol 通过在使用变量但从未初始化时抛出错误来“修复”此问题。
此外,您可以注意到,这只是“顶级”变量的问题。let
评论
0赞
hymced
10/29/2023
有趣,谢谢!我更好地理解为什么它不容易解决......您是如何注意到这个问题仅适用于“顶级”和变量的?let
var
1赞
Matthieu Riegler
10/29/2023
我知道规则有效,所以你的复制品必须有一些具体的东西!
0赞
hymced
10/29/2023
查看我所做的编辑。这也很有趣 github.com/microsoft/TypeScript/issues/......
评论