即使在“type”in`检查之后,属性“type”在类型“object”上不存在

Nin*_*liu 7 typescript typeguards

此代码无法编译:

const nodeIsUseless = (node: unknown) =>
  node !== null &&
  typeof node === "object" &&
  "type" in node &&
  typeof node.type === "string" &&
  node.type === "JSXText";
Run Code Online (Sandbox Code Playgroud)

因为在最后两行:

类型“对象”上不存在属性“类型”。(2339)

...我自己可以理解,但我不明白为什么"type" in node检查后, TS 推断node仍然是 typeobject而不是 type { type: unknown; [key: string]: unknown },这不会触发 error

Nin*_*liu 5

虽然代码是正确的,但 TypeScript 不具备推断能力{ type: unknown }"type" in node但此功能目前正在开发中


2022-09-21 更新:通过合并上述 PR,现在可以在 typescript@next 中完成此操作,并且应该很快在 typescript@latest 中可用。

另请参阅元上关于此答案的讨论。

  • 该功能已经实现。通过合并“[改进运算符 #50666 中的检查](https://github.com/microsoft/TypeScript/pull/50666)”,TypeScript 确实具有该功能。 (2认同)