Skip to content

"No repeated property names" error in object literals is duplicated in strict mode #46815

Closed
@sandersn

Description

@sandersn
Member

In strict mode (strict: true, inside a class or inside a module), duplicated property names get two errors instead of one:

// @strict: false
const first = { a: 1, a: 2 }
class C {
    m() {
        const second = { a: 1, a: 2 }
        return second.a
    }
}

Expected: one error on each a: 2.
Actual: two errors on the a: 2 inside the class:

  1. Diagnostics.An_object_literal_cannot_have_multiple_properties_with_the_same_name_in_strict_mode
  2. Diagnostics.Duplicate_identifier_0

In fact, the first error is better, but isn't used for first;

Expected: On firsts a: 2, the error should be "An object literal cannot have multiple properties with the same name."
Actual: Duplicate identifier 'a'.

This inconsistency arose because Typescript originally targetted ES3 and ES5; duplicate property names are only an error in ES5's strict mode. In fact, they're not even an error in ES2015+'s strict mode. But this is a good error, and it should apply everywhere.

Expected: The error should be "An object literal cannot have multiple properties with the same name."
Actual: "An object literal cannot have multiple properties with the same name in strict mode."

Thanks to https://stackoverflow.com/questions/36321790/js-two-or-more-object-properties-with-the-same-name-in-non-strict-mode for pointing out the spec changes.

Activity

added
BugA bug in TypeScript
Good First IssueWell scoped, documented and has the green light
on Nov 15, 2021
added this to the Backlog milestone on Nov 15, 2021
fatcerberus

fatcerberus commented on Nov 16, 2021

@fatcerberus

In strict mode (strict: true, inside a class or inside a module)

Wait, is this talking about JavaScript strict mode, or TypeScript strict: true?

sandersn

sandersn commented on Nov 16, 2021

@sandersn
MemberAuthor

Typescript's approximation of Javascript's strict mode. I think the flag is actually alwaysStrict: true, and strict: true includes it. But classes and modules also put their contents into strict mode.

fatcerberus

fatcerberus commented on Nov 17, 2021

@fatcerberus

classes and modules also put their contents into strict mode

Yep, I knew this, but then you mentioned strict: true (i.e. strict type checking mode) and got confused as to which one you were referring to. Classes and modules don't automatically enable all the strict type checker options, as far as I'm aware. :)

Yuuki77

Yuuki77 commented on Nov 27, 2021

@Yuuki77
Contributor

I will work on this issue 💪

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugA bug in TypeScriptDomain: Error MessagesThe issue relates to error messagingGood First IssueWell scoped, documented and has the green lightHelp WantedYou can do this

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

      Participants

      @sandersn@fatcerberus@Yuuki77

      Issue actions

        "No repeated property names" error in object literals is duplicated in strict mode · Issue #46815 · microsoft/TypeScript