Why does accessing a property of indexOf still compile?












16















I made a typo in TypeScript which was picked up during code review.



I used someArray.indexOf[someObject] instead of someArray.indexOf(someObject).



I would expect an error from the IDE/Compiler. Instead, no errors were raised and the result was simply undefined.



Can anyone explain this?










share|improve this question




















  • 1





    What did you assign the result of? Because what you wrote is valid you are taking the someObject member of the indexOf method. Well, trying to. The only error would come from TypeScript compilation and only if you try to assign the result to something that doesn't match the expected type.

    – vlaz
    15 hours ago






  • 9





    Welcome to javascript, where everything is an object!

    – Jean-Baptiste Yunès
    15 hours ago






  • 7





    @DeWetvanAs I am actually curious about your problem - this seems like a genuine bug/problem with TypeScript see example here. It seems that if you are trying to assign to a variable of type number, the result of .indexOf[someObject] shouldn't be considered a number and thus the compilation would fail. That's the whole idea of TypeScript is - to enforce the types. The answers here focus on JS but ignore this.

    – vlaz
    14 hours ago






  • 4





    @DeWetvanAs You might want to not accept an answer yet if none of them explains why you are not getting a TypeScript error.

    – Bergi
    14 hours ago











  • @Bergi As the question has underlined more and more the TS side, I've edited my answer! I think this should explain it :)

    – sjahan
    13 hours ago
















16















I made a typo in TypeScript which was picked up during code review.



I used someArray.indexOf[someObject] instead of someArray.indexOf(someObject).



I would expect an error from the IDE/Compiler. Instead, no errors were raised and the result was simply undefined.



Can anyone explain this?










share|improve this question




















  • 1





    What did you assign the result of? Because what you wrote is valid you are taking the someObject member of the indexOf method. Well, trying to. The only error would come from TypeScript compilation and only if you try to assign the result to something that doesn't match the expected type.

    – vlaz
    15 hours ago






  • 9





    Welcome to javascript, where everything is an object!

    – Jean-Baptiste Yunès
    15 hours ago






  • 7





    @DeWetvanAs I am actually curious about your problem - this seems like a genuine bug/problem with TypeScript see example here. It seems that if you are trying to assign to a variable of type number, the result of .indexOf[someObject] shouldn't be considered a number and thus the compilation would fail. That's the whole idea of TypeScript is - to enforce the types. The answers here focus on JS but ignore this.

    – vlaz
    14 hours ago






  • 4





    @DeWetvanAs You might want to not accept an answer yet if none of them explains why you are not getting a TypeScript error.

    – Bergi
    14 hours ago











  • @Bergi As the question has underlined more and more the TS side, I've edited my answer! I think this should explain it :)

    – sjahan
    13 hours ago














16












16








16


1






I made a typo in TypeScript which was picked up during code review.



I used someArray.indexOf[someObject] instead of someArray.indexOf(someObject).



I would expect an error from the IDE/Compiler. Instead, no errors were raised and the result was simply undefined.



Can anyone explain this?










share|improve this question
















I made a typo in TypeScript which was picked up during code review.



I used someArray.indexOf[someObject] instead of someArray.indexOf(someObject).



I would expect an error from the IDE/Compiler. Instead, no errors were raised and the result was simply undefined.



Can anyone explain this?







typescript methods properties






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 14 hours ago









Bergi

366k58546872




366k58546872










asked 15 hours ago









De Wet van AsDe Wet van As

1098




1098








  • 1





    What did you assign the result of? Because what you wrote is valid you are taking the someObject member of the indexOf method. Well, trying to. The only error would come from TypeScript compilation and only if you try to assign the result to something that doesn't match the expected type.

    – vlaz
    15 hours ago






  • 9





    Welcome to javascript, where everything is an object!

    – Jean-Baptiste Yunès
    15 hours ago






  • 7





    @DeWetvanAs I am actually curious about your problem - this seems like a genuine bug/problem with TypeScript see example here. It seems that if you are trying to assign to a variable of type number, the result of .indexOf[someObject] shouldn't be considered a number and thus the compilation would fail. That's the whole idea of TypeScript is - to enforce the types. The answers here focus on JS but ignore this.

    – vlaz
    14 hours ago






  • 4





    @DeWetvanAs You might want to not accept an answer yet if none of them explains why you are not getting a TypeScript error.

    – Bergi
    14 hours ago











  • @Bergi As the question has underlined more and more the TS side, I've edited my answer! I think this should explain it :)

    – sjahan
    13 hours ago














  • 1





    What did you assign the result of? Because what you wrote is valid you are taking the someObject member of the indexOf method. Well, trying to. The only error would come from TypeScript compilation and only if you try to assign the result to something that doesn't match the expected type.

    – vlaz
    15 hours ago






  • 9





    Welcome to javascript, where everything is an object!

    – Jean-Baptiste Yunès
    15 hours ago






  • 7





    @DeWetvanAs I am actually curious about your problem - this seems like a genuine bug/problem with TypeScript see example here. It seems that if you are trying to assign to a variable of type number, the result of .indexOf[someObject] shouldn't be considered a number and thus the compilation would fail. That's the whole idea of TypeScript is - to enforce the types. The answers here focus on JS but ignore this.

    – vlaz
    14 hours ago






  • 4





    @DeWetvanAs You might want to not accept an answer yet if none of them explains why you are not getting a TypeScript error.

    – Bergi
    14 hours ago











  • @Bergi As the question has underlined more and more the TS side, I've edited my answer! I think this should explain it :)

    – sjahan
    13 hours ago








1




1





What did you assign the result of? Because what you wrote is valid you are taking the someObject member of the indexOf method. Well, trying to. The only error would come from TypeScript compilation and only if you try to assign the result to something that doesn't match the expected type.

– vlaz
15 hours ago





What did you assign the result of? Because what you wrote is valid you are taking the someObject member of the indexOf method. Well, trying to. The only error would come from TypeScript compilation and only if you try to assign the result to something that doesn't match the expected type.

– vlaz
15 hours ago




9




9





Welcome to javascript, where everything is an object!

– Jean-Baptiste Yunès
15 hours ago





Welcome to javascript, where everything is an object!

– Jean-Baptiste Yunès
15 hours ago




7




7





@DeWetvanAs I am actually curious about your problem - this seems like a genuine bug/problem with TypeScript see example here. It seems that if you are trying to assign to a variable of type number, the result of .indexOf[someObject] shouldn't be considered a number and thus the compilation would fail. That's the whole idea of TypeScript is - to enforce the types. The answers here focus on JS but ignore this.

– vlaz
14 hours ago





@DeWetvanAs I am actually curious about your problem - this seems like a genuine bug/problem with TypeScript see example here. It seems that if you are trying to assign to a variable of type number, the result of .indexOf[someObject] shouldn't be considered a number and thus the compilation would fail. That's the whole idea of TypeScript is - to enforce the types. The answers here focus on JS but ignore this.

– vlaz
14 hours ago




4




4





@DeWetvanAs You might want to not accept an answer yet if none of them explains why you are not getting a TypeScript error.

– Bergi
14 hours ago





@DeWetvanAs You might want to not accept an answer yet if none of them explains why you are not getting a TypeScript error.

– Bergi
14 hours ago













@Bergi As the question has underlined more and more the TS side, I've edited my answer! I think this should explain it :)

– sjahan
13 hours ago





@Bergi As the question has underlined more and more the TS side, I've edited my answer! I think this should explain it :)

– sjahan
13 hours ago












4 Answers
4






active

oldest

votes


















24














Quite easy.



someArray.indexOf you know that this is a function, which is also an object and can have properties.



By doing someArray.indexOf[someObject], you are trying to reach the property with the key valued to the value of someObject.



Of course, it is not defined on the indexOf function, so it returns undefined.



Quick example that illustrates the syntax and the fact that a function can have properties ;) :






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





EDIT



Here is an attempt of an answer for the TypeScript side of the question.



As you already know, TypeScript is designed to be compatible with JavaScript. Therefore, as in JS, you can access a property of an object by the following ways:




  • 'Statically': obj.property

  • 'Dynamically': obj['property']


By using the 'static' way to access a property, of course, TypeScript will raise an error!



But with the dynamic way of accessing the property, there is no way TypeScript compiler can determine the type of it or if it exists or not, since the value between bracket will be evaluated at runtime, after TypeScript transpiling.



That's why it will be implicitly marked as any.



As David Sherret mentioned in his answer, you can force TypeScript to raise an error by adding the flag --noImplicitAny, please refer to his answer for more details about this!



Hoping this helps ;)






share|improve this answer





















  • 4





    I think answers here are missing the TypeScript tag. It's entirely reasonable to expect a compilation error in TS. Then again, it depends if you have index: number and index = arr.indexOf[obj] then that should be a compilation error. But index: any wouldn't throw a compilation error.

    – vlaz
    15 hours ago











  • @vlaz +1. sjahan gives OP a quick explanation of the undefined result but the main question remains...

    – Florian
    15 hours ago






  • 1





    "Of course, someone could say the compiler could understand" Yes, the compiler would understand. That is the entire reason for the compiler to be there and if TypeScript can't figure out that type is undetermined, then what good is TS at all? That's just a logical examination of the statement - David Sherret's answer points out that TS does indeed understand undetermined types and can raise an error for it. So your edit dispenses incorrect assumptions and information.

    – vlaz
    12 hours ago











  • @vlaz I think I didn't express myself correctly and my point could get misinterpreted. I'm going to edit the last part, thank you.

    – sjahan
    12 hours ago



















10














It does not error because the --noImplicitAny compiler option is not enabled. With that compiler option enabled you will get an error as expected:



noImplicitAny enabled



The reason is that an element access expression returns an object typed as any when the type has no index signature defined (this is an implicit any).



enter image description here



So again, since --noImplicitAny is not enabled, it does not error. I highly recommend turning this compiler option on.






share|improve this answer

































    4














    array.indexOf is a function.



    Functions are objects.



    You were accessing the someObject property of the array.indexOf function.



    You would have got undefined.






    const array = [1, 2, 3]
    const someObject = 'asdasd'

    console.log(array.indexOf[someObject])
    // undefined








    share|improve this answer





















    • 1





      Array.indexOf is undefined, Array.prototype.indexOf, on the other hand, is a function.

      – Pavlo
      14 hours ago











    • You’re right! I fixed the typo in my answer. Thanks

      – 0xc14m1z
      14 hours ago



















    0














    The only real issue here is that you expected Typescript to throw an error that exposed the problem in your logic. The intended logic was to use curly braces and utilise the someArray.indexOf(someObject) function.



    What happened when you used square braces, someArray.indexOf[someObject], was that the JS runtime first converted your object someObject into a string by calling the function someObject.toString, which most likely returned "[object object]". Then the someArray.indexOf object was queried for the key "[object object]" which wasn't present, returning undefined. As far as Typescript goes, this is completely fine.



    David Sherret pointed out that --noImplicitAny would have pointed out the error, but it would only have pointed out a different error, as he explained, which would not directly have helped you to find the flaw in your logic.






    share|improve this answer























      Your Answer






      StackExchange.ifUsing("editor", function () {
      StackExchange.using("externalEditor", function () {
      StackExchange.using("snippets", function () {
      StackExchange.snippets.init();
      });
      });
      }, "code-snippets");

      StackExchange.ready(function() {
      var channelOptions = {
      tags: "".split(" "),
      id: "1"
      };
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function() {
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled) {
      StackExchange.using("snippets", function() {
      createEditor();
      });
      }
      else {
      createEditor();
      }
      });

      function createEditor() {
      StackExchange.prepareEditor({
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      bindNavPrevention: true,
      postfix: "",
      imageUploader: {
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      },
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      });


      }
      });














      draft saved

      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54254396%2fwhy-does-accessing-a-property-of-indexof-still-compile%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      4 Answers
      4






      active

      oldest

      votes








      4 Answers
      4






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      24














      Quite easy.



      someArray.indexOf you know that this is a function, which is also an object and can have properties.



      By doing someArray.indexOf[someObject], you are trying to reach the property with the key valued to the value of someObject.



      Of course, it is not defined on the indexOf function, so it returns undefined.



      Quick example that illustrates the syntax and the fact that a function can have properties ;) :






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





      EDIT



      Here is an attempt of an answer for the TypeScript side of the question.



      As you already know, TypeScript is designed to be compatible with JavaScript. Therefore, as in JS, you can access a property of an object by the following ways:




      • 'Statically': obj.property

      • 'Dynamically': obj['property']


      By using the 'static' way to access a property, of course, TypeScript will raise an error!



      But with the dynamic way of accessing the property, there is no way TypeScript compiler can determine the type of it or if it exists or not, since the value between bracket will be evaluated at runtime, after TypeScript transpiling.



      That's why it will be implicitly marked as any.



      As David Sherret mentioned in his answer, you can force TypeScript to raise an error by adding the flag --noImplicitAny, please refer to his answer for more details about this!



      Hoping this helps ;)






      share|improve this answer





















      • 4





        I think answers here are missing the TypeScript tag. It's entirely reasonable to expect a compilation error in TS. Then again, it depends if you have index: number and index = arr.indexOf[obj] then that should be a compilation error. But index: any wouldn't throw a compilation error.

        – vlaz
        15 hours ago











      • @vlaz +1. sjahan gives OP a quick explanation of the undefined result but the main question remains...

        – Florian
        15 hours ago






      • 1





        "Of course, someone could say the compiler could understand" Yes, the compiler would understand. That is the entire reason for the compiler to be there and if TypeScript can't figure out that type is undetermined, then what good is TS at all? That's just a logical examination of the statement - David Sherret's answer points out that TS does indeed understand undetermined types and can raise an error for it. So your edit dispenses incorrect assumptions and information.

        – vlaz
        12 hours ago











      • @vlaz I think I didn't express myself correctly and my point could get misinterpreted. I'm going to edit the last part, thank you.

        – sjahan
        12 hours ago
















      24














      Quite easy.



      someArray.indexOf you know that this is a function, which is also an object and can have properties.



      By doing someArray.indexOf[someObject], you are trying to reach the property with the key valued to the value of someObject.



      Of course, it is not defined on the indexOf function, so it returns undefined.



      Quick example that illustrates the syntax and the fact that a function can have properties ;) :






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





      EDIT



      Here is an attempt of an answer for the TypeScript side of the question.



      As you already know, TypeScript is designed to be compatible with JavaScript. Therefore, as in JS, you can access a property of an object by the following ways:




      • 'Statically': obj.property

      • 'Dynamically': obj['property']


      By using the 'static' way to access a property, of course, TypeScript will raise an error!



      But with the dynamic way of accessing the property, there is no way TypeScript compiler can determine the type of it or if it exists or not, since the value between bracket will be evaluated at runtime, after TypeScript transpiling.



      That's why it will be implicitly marked as any.



      As David Sherret mentioned in his answer, you can force TypeScript to raise an error by adding the flag --noImplicitAny, please refer to his answer for more details about this!



      Hoping this helps ;)






      share|improve this answer





















      • 4





        I think answers here are missing the TypeScript tag. It's entirely reasonable to expect a compilation error in TS. Then again, it depends if you have index: number and index = arr.indexOf[obj] then that should be a compilation error. But index: any wouldn't throw a compilation error.

        – vlaz
        15 hours ago











      • @vlaz +1. sjahan gives OP a quick explanation of the undefined result but the main question remains...

        – Florian
        15 hours ago






      • 1





        "Of course, someone could say the compiler could understand" Yes, the compiler would understand. That is the entire reason for the compiler to be there and if TypeScript can't figure out that type is undetermined, then what good is TS at all? That's just a logical examination of the statement - David Sherret's answer points out that TS does indeed understand undetermined types and can raise an error for it. So your edit dispenses incorrect assumptions and information.

        – vlaz
        12 hours ago











      • @vlaz I think I didn't express myself correctly and my point could get misinterpreted. I'm going to edit the last part, thank you.

        – sjahan
        12 hours ago














      24












      24








      24







      Quite easy.



      someArray.indexOf you know that this is a function, which is also an object and can have properties.



      By doing someArray.indexOf[someObject], you are trying to reach the property with the key valued to the value of someObject.



      Of course, it is not defined on the indexOf function, so it returns undefined.



      Quick example that illustrates the syntax and the fact that a function can have properties ;) :






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





      EDIT



      Here is an attempt of an answer for the TypeScript side of the question.



      As you already know, TypeScript is designed to be compatible with JavaScript. Therefore, as in JS, you can access a property of an object by the following ways:




      • 'Statically': obj.property

      • 'Dynamically': obj['property']


      By using the 'static' way to access a property, of course, TypeScript will raise an error!



      But with the dynamic way of accessing the property, there is no way TypeScript compiler can determine the type of it or if it exists or not, since the value between bracket will be evaluated at runtime, after TypeScript transpiling.



      That's why it will be implicitly marked as any.



      As David Sherret mentioned in his answer, you can force TypeScript to raise an error by adding the flag --noImplicitAny, please refer to his answer for more details about this!



      Hoping this helps ;)






      share|improve this answer















      Quite easy.



      someArray.indexOf you know that this is a function, which is also an object and can have properties.



      By doing someArray.indexOf[someObject], you are trying to reach the property with the key valued to the value of someObject.



      Of course, it is not defined on the indexOf function, so it returns undefined.



      Quick example that illustrates the syntax and the fact that a function can have properties ;) :






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





      EDIT



      Here is an attempt of an answer for the TypeScript side of the question.



      As you already know, TypeScript is designed to be compatible with JavaScript. Therefore, as in JS, you can access a property of an object by the following ways:




      • 'Statically': obj.property

      • 'Dynamically': obj['property']


      By using the 'static' way to access a property, of course, TypeScript will raise an error!



      But with the dynamic way of accessing the property, there is no way TypeScript compiler can determine the type of it or if it exists or not, since the value between bracket will be evaluated at runtime, after TypeScript transpiling.



      That's why it will be implicitly marked as any.



      As David Sherret mentioned in his answer, you can force TypeScript to raise an error by adding the flag --noImplicitAny, please refer to his answer for more details about this!



      Hoping this helps ;)






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





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






      share|improve this answer














      share|improve this answer



      share|improve this answer








      edited 12 hours ago

























      answered 15 hours ago









      sjahansjahan

      3,2501828




      3,2501828








      • 4





        I think answers here are missing the TypeScript tag. It's entirely reasonable to expect a compilation error in TS. Then again, it depends if you have index: number and index = arr.indexOf[obj] then that should be a compilation error. But index: any wouldn't throw a compilation error.

        – vlaz
        15 hours ago











      • @vlaz +1. sjahan gives OP a quick explanation of the undefined result but the main question remains...

        – Florian
        15 hours ago






      • 1





        "Of course, someone could say the compiler could understand" Yes, the compiler would understand. That is the entire reason for the compiler to be there and if TypeScript can't figure out that type is undetermined, then what good is TS at all? That's just a logical examination of the statement - David Sherret's answer points out that TS does indeed understand undetermined types and can raise an error for it. So your edit dispenses incorrect assumptions and information.

        – vlaz
        12 hours ago











      • @vlaz I think I didn't express myself correctly and my point could get misinterpreted. I'm going to edit the last part, thank you.

        – sjahan
        12 hours ago














      • 4





        I think answers here are missing the TypeScript tag. It's entirely reasonable to expect a compilation error in TS. Then again, it depends if you have index: number and index = arr.indexOf[obj] then that should be a compilation error. But index: any wouldn't throw a compilation error.

        – vlaz
        15 hours ago











      • @vlaz +1. sjahan gives OP a quick explanation of the undefined result but the main question remains...

        – Florian
        15 hours ago






      • 1





        "Of course, someone could say the compiler could understand" Yes, the compiler would understand. That is the entire reason for the compiler to be there and if TypeScript can't figure out that type is undetermined, then what good is TS at all? That's just a logical examination of the statement - David Sherret's answer points out that TS does indeed understand undetermined types and can raise an error for it. So your edit dispenses incorrect assumptions and information.

        – vlaz
        12 hours ago











      • @vlaz I think I didn't express myself correctly and my point could get misinterpreted. I'm going to edit the last part, thank you.

        – sjahan
        12 hours ago








      4




      4





      I think answers here are missing the TypeScript tag. It's entirely reasonable to expect a compilation error in TS. Then again, it depends if you have index: number and index = arr.indexOf[obj] then that should be a compilation error. But index: any wouldn't throw a compilation error.

      – vlaz
      15 hours ago





      I think answers here are missing the TypeScript tag. It's entirely reasonable to expect a compilation error in TS. Then again, it depends if you have index: number and index = arr.indexOf[obj] then that should be a compilation error. But index: any wouldn't throw a compilation error.

      – vlaz
      15 hours ago













      @vlaz +1. sjahan gives OP a quick explanation of the undefined result but the main question remains...

      – Florian
      15 hours ago





      @vlaz +1. sjahan gives OP a quick explanation of the undefined result but the main question remains...

      – Florian
      15 hours ago




      1




      1





      "Of course, someone could say the compiler could understand" Yes, the compiler would understand. That is the entire reason for the compiler to be there and if TypeScript can't figure out that type is undetermined, then what good is TS at all? That's just a logical examination of the statement - David Sherret's answer points out that TS does indeed understand undetermined types and can raise an error for it. So your edit dispenses incorrect assumptions and information.

      – vlaz
      12 hours ago





      "Of course, someone could say the compiler could understand" Yes, the compiler would understand. That is the entire reason for the compiler to be there and if TypeScript can't figure out that type is undetermined, then what good is TS at all? That's just a logical examination of the statement - David Sherret's answer points out that TS does indeed understand undetermined types and can raise an error for it. So your edit dispenses incorrect assumptions and information.

      – vlaz
      12 hours ago













      @vlaz I think I didn't express myself correctly and my point could get misinterpreted. I'm going to edit the last part, thank you.

      – sjahan
      12 hours ago





      @vlaz I think I didn't express myself correctly and my point could get misinterpreted. I'm going to edit the last part, thank you.

      – sjahan
      12 hours ago













      10














      It does not error because the --noImplicitAny compiler option is not enabled. With that compiler option enabled you will get an error as expected:



      noImplicitAny enabled



      The reason is that an element access expression returns an object typed as any when the type has no index signature defined (this is an implicit any).



      enter image description here



      So again, since --noImplicitAny is not enabled, it does not error. I highly recommend turning this compiler option on.






      share|improve this answer






























        10














        It does not error because the --noImplicitAny compiler option is not enabled. With that compiler option enabled you will get an error as expected:



        noImplicitAny enabled



        The reason is that an element access expression returns an object typed as any when the type has no index signature defined (this is an implicit any).



        enter image description here



        So again, since --noImplicitAny is not enabled, it does not error. I highly recommend turning this compiler option on.






        share|improve this answer




























          10












          10








          10







          It does not error because the --noImplicitAny compiler option is not enabled. With that compiler option enabled you will get an error as expected:



          noImplicitAny enabled



          The reason is that an element access expression returns an object typed as any when the type has no index signature defined (this is an implicit any).



          enter image description here



          So again, since --noImplicitAny is not enabled, it does not error. I highly recommend turning this compiler option on.






          share|improve this answer















          It does not error because the --noImplicitAny compiler option is not enabled. With that compiler option enabled you will get an error as expected:



          noImplicitAny enabled



          The reason is that an element access expression returns an object typed as any when the type has no index signature defined (this is an implicit any).



          enter image description here



          So again, since --noImplicitAny is not enabled, it does not error. I highly recommend turning this compiler option on.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited 9 hours ago

























          answered 13 hours ago









          David SherretDavid Sherret

          51k16120123




          51k16120123























              4














              array.indexOf is a function.



              Functions are objects.



              You were accessing the someObject property of the array.indexOf function.



              You would have got undefined.






              const array = [1, 2, 3]
              const someObject = 'asdasd'

              console.log(array.indexOf[someObject])
              // undefined








              share|improve this answer





















              • 1





                Array.indexOf is undefined, Array.prototype.indexOf, on the other hand, is a function.

                – Pavlo
                14 hours ago











              • You’re right! I fixed the typo in my answer. Thanks

                – 0xc14m1z
                14 hours ago
















              4














              array.indexOf is a function.



              Functions are objects.



              You were accessing the someObject property of the array.indexOf function.



              You would have got undefined.






              const array = [1, 2, 3]
              const someObject = 'asdasd'

              console.log(array.indexOf[someObject])
              // undefined








              share|improve this answer





















              • 1





                Array.indexOf is undefined, Array.prototype.indexOf, on the other hand, is a function.

                – Pavlo
                14 hours ago











              • You’re right! I fixed the typo in my answer. Thanks

                – 0xc14m1z
                14 hours ago














              4












              4








              4







              array.indexOf is a function.



              Functions are objects.



              You were accessing the someObject property of the array.indexOf function.



              You would have got undefined.






              const array = [1, 2, 3]
              const someObject = 'asdasd'

              console.log(array.indexOf[someObject])
              // undefined








              share|improve this answer















              array.indexOf is a function.



              Functions are objects.



              You were accessing the someObject property of the array.indexOf function.



              You would have got undefined.






              const array = [1, 2, 3]
              const someObject = 'asdasd'

              console.log(array.indexOf[someObject])
              // undefined








              const array = [1, 2, 3]
              const someObject = 'asdasd'

              console.log(array.indexOf[someObject])
              // undefined





              const array = [1, 2, 3]
              const someObject = 'asdasd'

              console.log(array.indexOf[someObject])
              // undefined






              share|improve this answer














              share|improve this answer



              share|improve this answer








              edited 14 hours ago

























              answered 15 hours ago









              0xc14m1z0xc14m1z

              1,469513




              1,469513








              • 1





                Array.indexOf is undefined, Array.prototype.indexOf, on the other hand, is a function.

                – Pavlo
                14 hours ago











              • You’re right! I fixed the typo in my answer. Thanks

                – 0xc14m1z
                14 hours ago














              • 1





                Array.indexOf is undefined, Array.prototype.indexOf, on the other hand, is a function.

                – Pavlo
                14 hours ago











              • You’re right! I fixed the typo in my answer. Thanks

                – 0xc14m1z
                14 hours ago








              1




              1





              Array.indexOf is undefined, Array.prototype.indexOf, on the other hand, is a function.

              – Pavlo
              14 hours ago





              Array.indexOf is undefined, Array.prototype.indexOf, on the other hand, is a function.

              – Pavlo
              14 hours ago













              You’re right! I fixed the typo in my answer. Thanks

              – 0xc14m1z
              14 hours ago





              You’re right! I fixed the typo in my answer. Thanks

              – 0xc14m1z
              14 hours ago











              0














              The only real issue here is that you expected Typescript to throw an error that exposed the problem in your logic. The intended logic was to use curly braces and utilise the someArray.indexOf(someObject) function.



              What happened when you used square braces, someArray.indexOf[someObject], was that the JS runtime first converted your object someObject into a string by calling the function someObject.toString, which most likely returned "[object object]". Then the someArray.indexOf object was queried for the key "[object object]" which wasn't present, returning undefined. As far as Typescript goes, this is completely fine.



              David Sherret pointed out that --noImplicitAny would have pointed out the error, but it would only have pointed out a different error, as he explained, which would not directly have helped you to find the flaw in your logic.






              share|improve this answer




























                0














                The only real issue here is that you expected Typescript to throw an error that exposed the problem in your logic. The intended logic was to use curly braces and utilise the someArray.indexOf(someObject) function.



                What happened when you used square braces, someArray.indexOf[someObject], was that the JS runtime first converted your object someObject into a string by calling the function someObject.toString, which most likely returned "[object object]". Then the someArray.indexOf object was queried for the key "[object object]" which wasn't present, returning undefined. As far as Typescript goes, this is completely fine.



                David Sherret pointed out that --noImplicitAny would have pointed out the error, but it would only have pointed out a different error, as he explained, which would not directly have helped you to find the flaw in your logic.






                share|improve this answer


























                  0












                  0








                  0







                  The only real issue here is that you expected Typescript to throw an error that exposed the problem in your logic. The intended logic was to use curly braces and utilise the someArray.indexOf(someObject) function.



                  What happened when you used square braces, someArray.indexOf[someObject], was that the JS runtime first converted your object someObject into a string by calling the function someObject.toString, which most likely returned "[object object]". Then the someArray.indexOf object was queried for the key "[object object]" which wasn't present, returning undefined. As far as Typescript goes, this is completely fine.



                  David Sherret pointed out that --noImplicitAny would have pointed out the error, but it would only have pointed out a different error, as he explained, which would not directly have helped you to find the flaw in your logic.






                  share|improve this answer













                  The only real issue here is that you expected Typescript to throw an error that exposed the problem in your logic. The intended logic was to use curly braces and utilise the someArray.indexOf(someObject) function.



                  What happened when you used square braces, someArray.indexOf[someObject], was that the JS runtime first converted your object someObject into a string by calling the function someObject.toString, which most likely returned "[object object]". Then the someArray.indexOf object was queried for the key "[object object]" which wasn't present, returning undefined. As far as Typescript goes, this is completely fine.



                  David Sherret pointed out that --noImplicitAny would have pointed out the error, but it would only have pointed out a different error, as he explained, which would not directly have helped you to find the flaw in your logic.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered 5 hours ago









                  Alex SteinbergAlex Steinberg

                  419411




                  419411






























                      draft saved

                      draft discarded




















































                      Thanks for contributing an answer to Stack Overflow!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid



                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.


                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54254396%2fwhy-does-accessing-a-property-of-indexof-still-compile%23new-answer', 'question_page');
                      }
                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      SQL Server 17 - Attemping to backup to remote NAS but Access is denied

                      Always On Availability groups resolving state after failover - Remote harden of transaction...

                      Restoring from pg_dump with foreign key constraints