TypeScript 当strictNullChecks=false时,未知类型的明显类型导致属性访问上的奇怪错误,

xmd2e60i  于 9个月前  发布在  TypeScript
关注(0)|答案(1)|浏览(98)

strictNullChecks 被禁用(如JS代码中所示)时,解构类型为 unknown 的变量会产生以下错误信息:

  1. Property 'foo' does not exist on type '{}'.(2339)

而启用它时,错误信息为:

  1. Property 'foo' does not exist on type 'unknown'.(2339)

这种行为实际上并没有在任何地方进行测试,并在 #47442 中被揭示。
当将 unknown 赋值给具有属性的某个类类型的变量时,会产生类似的错误:

  1. Property 'prop' is missing in type '{}' but required in type 'A'.(2741)

strictNullChecks = true 会产生一个更明显的错误:

  1. Type 'unknown' is not assignable to type 'A'.(2322)

这种行为(以及其他类似错误的捕获)实际上是在一些测试中体现出来的。
这一切似乎都源于 getApparentType 返回空对象类型作为 unknown 的明显类型,这是在 #30637 中添加的。我个人认为上述示例中的后两种错误比提及 {} 更合理,因为它实际上并没有出现在代码的任何地方。目前,这似乎并不太明显(因为JavaScript的人不太可能看到 unknown ),但随着 #47383 / #47442 的出现,这种情况可能会变得更加明显。

  1. const { foo } = {} as unknown;
  2. function func({ foo }: unknown) {}
  3. try {} catch ({ foo }) {}
  4. class A {
  5. prop: number;
  6. }
  7. const a: A = {} as unknown;

Playground链接已从 #47442 (评论)中分离出来。

sqougxex

sqougxex1#

现在我仔细想了一下,如果不使用checkJs,这个消息就不会出现在JS中,所以也许这并不是一个大问题,但如果有人在运行时关闭了严格的空值检查,那么这会有点尴尬。

相关问题