当 strictNullChecks
被禁用(如JS代码中所示)时,解构类型为 unknown
的变量会产生以下错误信息:
Property 'foo' does not exist on type '{}'.(2339)
而启用它时,错误信息为:
Property 'foo' does not exist on type 'unknown'.(2339)
这种行为实际上并没有在任何地方进行测试,并在 #47442 中被揭示。
当将 unknown
赋值给具有属性的某个类类型的变量时,会产生类似的错误:
Property 'prop' is missing in type '{}' but required in type 'A'.(2741)
而 strictNullChecks = true
会产生一个更明显的错误:
Type 'unknown' is not assignable to type 'A'.(2322)
这种行为(以及其他类似错误的捕获)实际上是在一些测试中体现出来的。
这一切似乎都源于 getApparentType
返回空对象类型作为 unknown
的明显类型,这是在 #30637 中添加的。我个人认为上述示例中的后两种错误比提及 {}
更合理,因为它实际上并没有出现在代码的任何地方。目前,这似乎并不太明显(因为JavaScript的人不太可能看到 unknown
),但随着 #47383 / #47442 的出现,这种情况可能会变得更加明显。
const { foo } = {} as unknown;
function func({ foo }: unknown) {}
try {} catch ({ foo }) {}
class A {
prop: number;
}
const a: A = {} as unknown;
Playground链接已从 #47442 (评论)中分离出来。
1条答案
按热度按时间sqougxex1#
现在我仔细想了一下,如果不使用checkJs,这个消息就不会出现在JS中,所以也许这并不是一个大问题,但如果有人在运行时关闭了严格的空值检查,那么这会有点尴尬。