【问题标题】:Cannot use 'in' operator to search for 'colour' in true (related function return type)无法使用“in”运算符在 true 中搜索“color”(相关函数返回类型)
【发布时间】:2019-12-13 18:17:47
【问题描述】:

所以我在打字稿中有以下代码:

let a: unknown = true;

if(hasColour(a)) {
    console.log(a.colour);  // I want to use a.colour after checking a does have the colour property
}

所以我创建了一个函数来确定我是否有颜色属性:

function hasColour (obj: any) : boolean {
    return !!obj &&
    "colour" in obj &&
    typeof obj == "object" 

}  

我收到以下错误:

不能使用 'in' 运算符在 true 中搜索 'color'。

对此的解决方法是指定,而不是布尔值作为返回类型: obj is { colour: string } 像这样:

function hasColour (obj: any) : obj is { colour: string } {
    return !!obj &&
    "colour" in obj &&
    typeof obj == "object" 

}  

为什么这行得通? hasColour 不应该返回真/假吗? 为什么它可以使用 obj is { colour: string } 作为返回类型?

【问题讨论】:

  • 您的代码仍然会引发运行时异常。你可能想要:typeof obj === 'object' && obj !== null && 'colour' in obj
  • zerkms,这确实有效: function hasColour (obj: any) : obj is { colour: string } { return !!obj && typeof obj == 'object' && 'colour' in obj } 是否我使用撇号或双引号。 ...问题是它为什么有效...为什么不将布尔值作为返回类型?毕竟,我正在测试该对象是否具有该属性(是)或不(否)
  • 它不起作用,它仍然抛出运行时异常。你也最好停止使用any,改用unknown
  • @nos 实际上不是:它是 'colour' in obj 其中obj 是抛出的布尔值。

标签: typescript


【解决方案1】:

...之间的区别

function hasColour (obj: any) : boolean {
    return !!obj &&
    typeof obj == "object" &&
    "colour" in obj
}  

...和...

function hasColour (obj: any) : obj is { colour: string } {
    return !!obj &&
    typeof obj == "object" &&
    "colour" in obj
}

...第二个构造是type guard。类型保护会将您的 unknown 类型缩小为 { colour: string }。在使用类型保护的if 范围内,编译器将断言colour 属性的存在。

第一个构造只返回一个boolean。编译器不能从中断言任何内容,因为它不知道在函数中您实际上是在进行类型检查。使用类型保护,您可以明确告诉编译器它应该断言类型。

【讨论】:

  • 问题是这个类型守卫抛出,它根本是错误的。
  • @zerkms 是的。 :)
  • 现在如果将any 更改为unknown 将是理想的:-)
  • @zerkms:在原始代码中,参数的类型为unknown。这就是我所指的。
  • function hasColour (obj: unknown) --- 带有未知参数的类型保护是一种可行的方法:让编译器帮助您推断类型,而不是忽略它的发现。
猜你喜欢
  • 2014-10-31
  • 1970-01-01
  • 2016-03-03
  • 2013-01-15
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多