<div dir="ltr"><div>> Is Case 1 equivalent to a briefer version of</div>> ```<div>   if (userName == undefined) {<br>       throw new Error(`Argument cannot be null: ${Object.keys({userName})[0]}`);<br>   }<br></div><div>```</div><div>Less readable but in this simple case might work.</div><div>What if we do the following:</div><div><div style="color:rgb(80,0,80)">Case 1. Function guard.</div><div style="color:rgb(80,0,80)">```</div><div style="color:rgb(80,0,80)">function func1(options) {</div><div style="color:rgb(80,0,80)">...</div><div style="color:rgb(80,0,80)">   if (options.userName == undefined) {</div><div style="color:rgb(80,0,80)">       throw new ParamNullError(nameof options.userName); // `ParamNullError` is a custom error, derived from `Error`, composes error message like "Argument cannot be null: userName".</div><div style="color:rgb(80,0,80)">   }</div><div style="color:rgb(80,0,80)">}</div><div style="color:rgb(80,0,80)">```</div></div><div style="color:rgb(80,0,80)"><br></div><div style="color:rgb(80,0,80)">Case 2. Accessing property extended info</div><div style="color:rgb(80,0,80)">e.g.</div><div style="color:rgb(80,0,80)">```</div><div style="color:rgb(80,0,80)">const descriptor1 = Object.getOwnPropertyDescriptor(object1, 'property1');</div><div style="color:rgb(80,0,80)">```</div><div style="color:rgb(80,0,80)">vs</div><div style="color:rgb(80,0,80)">```</div><div style="color:rgb(80,0,80)">const descriptor1 = Object.getOwnPropertyDescriptor(object1, nameof object1.property1);  </div><div style="color:rgb(80,0,80)">```</div><div style="color:rgb(80,0,80)">2nd variant (proposed) has more chances not to be broken during refactoring (robustness).</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Jun 14, 2019 at 9:48 PM Stas Berkov <<a href="mailto:stas.berkov@gmail.com">stas.berkov@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Less fragile. Less mess. You can rename field/property without fear you break something (using IDE refactoring tools).<div>With high probablity you will break something when you refactor and have fields hardcoded as strings.</div><div>Someone can object that you can rename strings as well.</div><div>Issue here that you can ocassionally change non-related strings that should not be changed even they match or have matching substring.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Jun 14, 2019 at 9:38 PM guest271314 <<a href="mailto:guest271314@gmail.com" target="_blank">guest271314@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Is Case 1 equivalent to a briefer version of<div><br></div><div>```<br>   if (userName == undefined) {<br>       throw new Error(`Argument cannot be null: ${Object.keys({userName})[0]}`);<br>   }<br></div><div>```</div><div><br></div><div>? </div><div><br></div><div>If not, how is ```nameof``` different?</div><div><br></div><div>What is the difference between the use of ```<span style="background-color:transparent;color:inherit;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:14px;white-space:pre-wrap">message.hasOwnProperty(property)``` and </span>```nameof msg.expiration_utc_time```?</div><div><br></div><div>> <span style="color:rgb(51,51,51);font-family:Georgia,"Times New Roman",Times,serif;font-size:16px">You get more robust code.</span></div><div><br></div><div>How is "robust" objectively determined?</div><div><br></div><div><br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Jun 14, 2019 at 5:21 PM Stas Berkov <<a href="mailto:stas.berkov@gmail.com" target="_blank">stas.berkov@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">ES can befit from `nameof` feature the same way as TS. There is no TS specific in it.<div>It was ask to introduce in TS as a workaround since TS is considered as extention of ES.<br><div><br></div><div>Case 1. Function guard.</div><div>```</div><div>function func1(param1, param2, param3, userName, param4, param5) {</div><div>   if (userName == undefined) {</div><div>       throw new ArgumentNullError(nameof userName); // `ArgumentNullError` is a custom error, derived from `Error`, composes error message like "Argument cannot be null: userName".</div><div>   }</div><div>}</div><div>```</div><div><br></div><div>Case 2. Access extended information an object property.</div><div>Assume a function<br></div><div>```</div><div>function protoPropertyIsSet(message, property) {<br>    return message != null && message.hasOwnProperty(property);<br>}<br></div><div>```<br></div><div>Then in code you use it as `if (protoPropertyIsSet(msg, "expiration_utc_time")) {... }`.</div><div>Having `nameof` would allow you to do that `if (protoPropertyIsSet(msg, nameof msg.expiration_utc_time)) {... }`.</div><div>You get more robust code.</div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Jun 14, 2019 at 5:46 PM Augusto Moura <<a href="mailto:augusto.borgesm@gmail.com" target="_blank">augusto.borgesm@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Can you list the benefits of having this operators? Maybe with example use cases<br>
<br>
If I understand it correctly, the operator fits better in compiled<br>
(and typed) languages, most of the use cases don't apply to dynamic<br>
Javascript<br>
The only legit use case I can think of is helping refactor tools to<br>
rename properties (but even mismatch errors between strings and<br>
properties names can be caught in compile time using modern<br>
Typescript)<br>
<br>
Em sex, 14 de jun de 2019 às 10:05, Stas Berkov<br>
<<a href="mailto:stas.berkov@gmail.com" target="_blank">stas.berkov@gmail.com</a>> escreveu:<br>
><br>
> Can we revisit this issue?<br>
><br>
><br>
> In C# there is `nameof`, in Swift you can do the same by calling<br>
><br>
> ```<br>
><br>
> let keyPath = \Person.mother.firstName<br>
><br>
> NSPredicate(format: "%K == %@", keyPath, "Andrew")<br>
><br>
> ```<br>
><br>
> Let's introduce `nameof` in ES, please.<br>
><br>
><br>
> Devs from TypeScript don't want to introduce this feature in TypeScript unless it is available in ES ( <a href="https://github.com/microsoft/TypeScript/issues/1579" rel="noreferrer" target="_blank">https://github.com/microsoft/TypeScript/issues/1579</a> )<br>
><br>
> This feature is eagarly being asked by TypeScript community.<br>
><br>
><br>
> I understand there are couple issues related to `nameof` feature in ES. They are: minification and what to do if user already has `nameof` function.<br>
><br>
><br>
> Minification.<br>
><br>
> 1. If your code to be minimized be prepared that variable names will also change.<br>
><br>
> 2. (just a possibility) Minimizer can have option to replace `nameof(someVar)` with result of `nameof` function.<br>
><br>
><br>
><br>
> What if user already has `nameof` function.<br>
><br>
> 1. To maintain status quo we can user `nameof` function having priority over newly introduced language feature.<br>
><br>
> 2. OR we can use `typeof` syntax, e.g. `nameof msg.userName` (// returns "userName" string)<br>
><br>
> _______________________________________________<br>
> es-discuss mailing list<br>
> <a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
> <a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
<br>
<br>
<br>
-- <br>
Atenciosamente,<br>
<br>
Augusto Borges de Moura<br>
</blockquote></div>
_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</blockquote></div>
</blockquote></div>
</blockquote></div>