gpt4 book ai didi

typescript - 为什么 TypeScript 不缩小此类型保护中的任何类型?

转载 作者:搜寻专家 更新时间:2023-10-30 20:59:13 26 4
gpt4 key购买 nike

下面的例子让我很困惑:

class MyClass
{
public MyProp = "";
}

var object: any = null;

if (object instanceof MyClass)
console.log(object.MyProp, object.NonExistant); // <-- No error, no intellisense

为什么类型保护没有在检查的上下文中给我正确的类型?

最佳答案

User-defined type guardsinstanceof type guards不会缩小 any 的类型(包括 unionintersection 具有 any 的类型)。

唯一可以在类型保护中缩小 any 的方法是使用 typeof 检查并检查原始 stringbool, 和 number:

var something: any;
if (typeof something === "string")
{
something.NonExistant(); // <- Error, does not exist on `string`
something.substr(0, 10); // <- Ok
}

另一种泛型类型的值,functionobjectundefined,不会缩小 any 如果有人愿意的话尝试像上面的例子一样使用它们。

还有一个 open issue使得可以将 any 缩小为用户定义的类型保护中的基元,在 TS 2.0 中具有里程碑意义。

这是有意识的design decision而不是错误

主要动机似乎是对类型进行类型保护通常会缩小可能的类型范围,并且我们可以访问更多我们可以确定存在于已检查上下文中的属性。但是在对特殊的 any 进行类型保护的情况下,我们已经可以访问所有可能存在的成员,因此可以像您预期的那样对 any 进行类型保护在你的例子中实际上会限制我们。

另一个动机似乎也是有 too much crappy code如果 TypeScript 像其他类型一样缩小 any 的范围,那将会中断。

解决方法

如果您有一个可以是任意类实例的变量,请使用类型 Object 而不是 any 类型保护将按预期工作。

关于typescript - 为什么 TypeScript 不缩小此类型保护中的任何类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36940687/

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