代码之家  ›  专栏  ›  技术社区  ›  De Wet van As

为什么访问indexof的属性仍然编译?

  •  31
  • De Wet van As  · 技术社区  · 6 年前

    我做了一个打字稿的打字错误,这是在代码审查时发现的。

    我用过 someArray.indexOf[someObject] 而不是 someArray.indexOf(someObject) .

    我预计IDE/编译器会出错。相反,没有引发任何错误,结果只是未定义。

    有人能解释一下吗?

    4 回复  |  直到 6 年前
        1
  •  34
  •   sjahan    6 年前

    很容易。

    someArray.indexOf 你知道这是一个 function ,它也是一个对象,可以具有属性。

    通过做 someArray.indexOf[someObject] ,您正在尝试使用值为的键访问该属性。 someObject .

    当然,它没有在 indexOf 函数,所以它返回 undefined .

    说明语法和函数可以具有属性的事实的快速示例;):

    const array = [];
    array.indexOf['anyValue'] = 'test';
    console.log(array.indexOf.anyValue);

    编辑

    这里是一个问题的排字部分的答案。

    正如您已经知道的,typescript被设计为与javascript兼容。因此,与JS一样,可以通过以下方式访问对象的属性:

    • 静态地: obj.property
    • “动态”: obj['property']

    当然,通过使用“静态”方式访问属性,typescript将引发错误!

    但是,通过动态访问属性的方式,typescript编译器无法确定它的类型,也无法确定它是否存在,因为括号之间的值将在运行时在typescript发生后进行计算。

    这就是为什么它会被隐式标记为 any .

    正如大卫谢里特在他的 answer ,可以通过添加标志强制typescript引发错误。 --noImplicitAny ,请参考他的答案了解更多有关此的详细信息!

    希望这有帮助;)

        2
  •  24
  •   David Sherret    6 年前

    它不会出错,因为 --noImplicitAny compiler option 未启用。启用该编译器选项后,您将得到预期的错误:

    noImplicitAny enabled

    原因是元素访问表达式返回的对象类型为 any 当类型没有 index signature 定义(这是一个隐式 任何 )

    enter image description here

    因此,再次 ——无牵挂 未启用,不会出错。我强烈建议打开这个编译器选项。

        3
  •  6
  •   0xc14m1z    6 年前

    array.indexOf 是一个函数。

    函数是对象。

    您正在访问 someObject 性质 索引数组 功能。

    你会得到的 undefined .

    const array = [1, 2, 3]
    const someObject = 'asdasd'
    
    console.log(array.indexOf[someObject])
    // undefined
        4
  •  0
  •   Alex Steinberg    6 年前

    这里唯一真正的问题是,您期望typescript抛出一个错误,从而在逻辑中暴露出问题。预期的逻辑是使用大括号并使用 someArray.indexOf(someObject) 功能。

    你用方括号的时候发生了什么? someArray.indexOf[someObject] ,是JS运行时首先转换了您的对象吗? someObject 通过调用函数 someObject.toString 最有可能返回的 "[object object]" . 然后 someArray.indexOf 已查询对象以获取密钥 “[对象对象]” 不在场,回来了 undefined . 就typescript而言,这是完全正确的。

    大卫·谢里特指出 --noImplicitAny 会指出错误,但它只会指出一个不同的错误,正如他解释的那样,这不会直接帮助你发现逻辑中的缺陷。