我在TypeScript中打了一个错字,这是在代码检查过程中发现的。
我用someArray.indexOf[someObject]
代替了someArray.indexOf(someObject)
。
我希望IDE /编译器出现错误。而是没有引发任何错误,并且结果只是不确定的。
有人可以解释吗?
答案 0 :(得分:34)
非常简单。
someArray.indexOf
,您知道这是一个function
,它也是一个对象,可以具有属性。
通过执行someArray.indexOf[someObject]
,您尝试使用键值为someObject
的值到达属性。
当然,它不是在indexOf
函数上定义的,因此它返回undefined
。
简单的示例,说明语法和函数可以具有属性的事实;):
const array = [];
array.indexOf['anyValue'] = 'test';
console.log(array.indexOf.anyValue);
编辑
这里是对问题的TypeScript方面的回答。
您已经知道,TypeScript设计为与JavaScript兼容。因此,就像在JS中一样,您可以通过以下方式访问对象的属性:
obj.property
obj['property']
通过使用“静态”方式访问属性,TypeScript当然会引发错误!
但是使用动态访问属性的方法,TypeScript编译器无法确定属性的类型或属性的类型,因为在TypeScript编译后,将在运行时评估括号之间的值。
这就是为什么它将被隐式标记为any
。
正如David Sherret在他的answer中提到的那样,您可以通过添加标志--noImplicitAny
来强制TypeScript引发错误,请参见他的回答以获取更多详细信息!
希望这有帮助;)
答案 1 :(得分:24)
这不会出错,因为未启用dl {
display: grid;
grid-template-columns: max-content auto;
grid-column-gap: 1em;
grid-row-gap: 1em;
}
dt,
dd {
margin: 0;
padding: 0;
}
.speaker.stage-director {
display: none;
}
.statement.stage-director {
grid-column: span 2;
}
compiler option。启用该编译器选项后,您将得到预期的错误:
原因是,当元素访问表达式未定义index signature(这是隐式<dl>
<dt class="speaker">ROMEO</dt>
<dd class="statement">What, shall this speech be spoke for our excuse? Or shall we on without a apology?</dd>
<dt class="speaker stage-director"></dt>
<dd class="statement stage-director">This is a long statement of the stage director</dd>
<dt class="speaker">ROMEO</dt>
<dd class="statement">Give me a torch: I am not for this ambling; Being but heavy, I will bear the light.</dd>
<dt class="speaker">The magic big cat</dt>
<dd class="statement">I say nothing</dd>
<dt class="speaker">MERCUTIO</dt>
<dd class="statement">Nay, gentle Romeo, we must have you dance.</dd>
</dl>
)时,元素访问表达式将返回类型为--noImplicitAny
的对象。
同样,由于未启用any
,因此不会出错。我强烈建议打开此编译器选项。
答案 2 :(得分:6)
array.indexOf
是一个函数。
函数是对象。
您正在访问someObject
函数的array.indexOf
属性。
您将获得undefined
。
const array = [1, 2, 3]
const someObject = 'asdasd'
console.log(array.indexOf[someObject])
// undefined
答案 3 :(得分:0)
这里唯一真正的问题是您希望Typescript抛出一个错误,使您的逻辑暴露出来。预期的逻辑是使用花括号并利用someArray.indexOf(someObject)
函数。
当使用方括号someArray.indexOf[someObject]
时,发生的事情是JS运行时首先通过调用函数someObject
将对象someObject.toString
转换为字符串,该函数很可能返回了{{ 1}}。然后,向"[object object]"
对象查询不存在的密钥someArray.indexOf
,并返回"[object object]"
。就Typescript而言,这完全可以。
David Sherret指出undefined
会指出错误,但是正如他所解释的那样,它只会指出不同的错误,这不会直接帮助您发现逻辑缺陷。