Description
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:
- Diagnostics.An_object_literal_cannot_have_multiple_properties_with_the_same_name_in_strict_mode
- Diagnostics.Duplicate_identifier_0
In fact, the first error is better, but isn't used for first
;
Expected: On first
s 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
fatcerberus commentedon Nov 16, 2021
Wait, is this talking about JavaScript strict mode, or TypeScript
strict: true
?sandersn commentedon Nov 16, 2021
Typescript's approximation of Javascript's strict mode. I think the flag is actually
alwaysStrict: true
, andstrict: true
includes it. But classes and modules also put their contents into strict mode.fatcerberus commentedon Nov 17, 2021
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 commentedon Nov 27, 2021
I will work on this issue 💪