node !== null && typeof node === "object-6ren">
gpt4 book ai didi

typescript - 属性 'type' 在类型 'object' 上不存在,即使在 `"type"in` 检查之后

转载 作者:行者123 更新时间:2023-12-05 08:35:43 25 4
gpt4 key购买 nike

This code编译失败:

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

因为在最后两行:

Property 'type' does not exist on type 'object'.(2339)

...我自己可以理解,但我不明白为什么在 "type"in node 检查之后,TS 推断 node 仍然是类型 object 而不是 type { type: unknown; [键:字符串]:未知would not trigger error .

最佳答案

不幸的是,内置的 TypeScript in operator type guard并不像您期望的那样强大。

从一个裸对象,它不会推断被测试的属性是可用的。它可以推断它确实存在,如果它已经可能可用,例如在联合类型之一中。 IE。控制流不会使被测试的属性“出现”,而只会尝试区分联合类型。

declare const o: object;
if ("type" in o) {
o.type // Error: Property 'type' does not exist on type 'object'.
//^? object
}

declare const u: Number | String; // Note: using class only for the sake of the demo
if ("toFixed" in u) {
u.toFixed(); // Okay
//^? Number
}

Playground Link


在您的情况下,您因此可以为 node 参数指定一个联合,其类型可能为例如{类型:未知}

但是,unknown top type absorbs联合中的所有其他类型,因此必须将其替换为其他所有类型,例如使用特殊类型 {} 表示常见类型:

const nodeIsUseless = (node: undefined | null | {} | { type: unknown }) =>
node !== null &&
typeof node === "object" &&
// ^? {} | { type: unknown } | undefined
"type" in node &&
// ^? {} | { type: unknown }
typeof node.type === "string" && // Okay
// ^? { type: unknown }
node.type === "JSXText"; // Okay

Playground Link

关于typescript - 属性 'type' 在类型 'object' 上不存在,即使在 `"type"in` 检查之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73355349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com