【发布时间】: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