为什么访问indexOf属性仍然可以编译?

时间:2019-01-18 12:51:11

标签: typescript methods properties

我在TypeScript中打了一个错字,这是在代码检查过程中发现的。

我用someArray.indexOf[someObject]代替了someArray.indexOf(someObject)

我希望IDE /编译器出现错误。而是没有引发任何错误,并且结果只是不确定的。

有人可以解释吗?

4 个答案:

答案 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。启用该编译器选项后,您将得到预期的错误:

noImplicitAny enabled

原因是,当元素访问表达式未定义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的对象。

enter image description here

同样,由于未启用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会指出错误,但是正如他所解释的那样,它只会指出不同的错误,这不会直接帮助您发现逻辑缺陷。