<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">20 февр. 2018 г., в 22:32, Mike Samuel <<a href="mailto:mikesamuel@gmail.com" class="">mikesamuel@gmail.com</a>> написал(а):</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><br class=""><div class="gmail_extra"><br class=""><div class="gmail_quote">On Tue, Feb 20, 2018 at 1:20 PM, T.J. Crowder <span dir="ltr" class=""><<a href="mailto:tj.crowder@farsightsoftware.com" target="_blank" class="">tj.crowder@farsightsoftware.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class=""><span class="">On Tue, Feb 20, 2018 at 6:05 PM, Mike Samuel <<a href="mailto:mikesamuel@gmail.com" target="_blank" class="">mikesamuel@gmail.com</a>> wrote:<br class="">><br class="">> I'm probably just going to echo themes that T.J. has dealt with better, but:<div class=""><br class=""></div></span><div class="">Quite the opposite.</div><div class=""><br class=""></div><div class="">And keying off Mike's excellent summary: I like the idea of providing a means of handling preconditions (and postconditions), of which runtime type checking is one example but only one. I'd just prefer to see it as a general mechanism than type-checking specifically.</div><div class=""><br class=""></div><div class="">I suggest getting deep into the decorators stuff and helping push it forward, possibly into areas where it hasn't previously been headed (such as your `let x = sum(y, y)` where you want to have runtime type checking on what gets assigned to `x` -- as far as I know, that isn't even on their radar). Basically that's applying a precondition to the assignment to `x` (or a postcondition on the call to `sum`). Which could be interesting. You may or may not get agreement on pushing forward that far, but if you feel strongly about the functionality you're after, I see that as the direction to pursue. (Not that I'm in ANY way any kind of authority on moving things through the process here. Not remotely.)</div><span class="HOEnZb"><font color="#888888" class=""><div class=""><br class=""></div><div class="">-- T.J. Crowder</div></font></span></div>
</blockquote></div><br class=""></div><div class="gmail_extra">One way that decorators (I keep saying annotations) for locals might work is:</div><div class="gmail_extra"><br class=""></div><div class="gmail_extra">@foo</div><div class="gmail_extra">const x = initialValue</div><div class="gmail_extra">f(x)<br class=""></div><div class="gmail_extra"><br class=""></div><div class="gmail_extra">desugars to</div><div class="gmail_extra"><br class=""></div><div class="gmail_extra">const x = foo(undefined, initialValue)</div><div class="gmail_extra">f(foo(x))</div><div class="gmail_extra"><br class=""></div><div class="gmail_extra">When the decorated local is used as a left-hand side, the use is wrapped in a call to the decorator.</div><div class="gmail_extra">When the decorated local is used as a right-hand side, the value assigned is the result of the decorator applied to the previous value and the candidate value.</div><div class="gmail_extra"><br class=""></div><div class="gmail_extra">I think that would be enough to build guards upon.</div><div class="gmail_extra"><br class=""></div></div>
</div></blockquote><br class=""></div><div class="">I don’t understand how it will be comfortable to write decorators for checking arguments of every function with different set of arguments:</div><div class=""><br class=""></div><div class="">```</div><div class="">function a(b: PrimitiveNumber) {}</div><div class=""><br class=""></div><div class="">function a1({ x: PrimitiveBoolean, d: PrimitiveString }) {}</div><div class=""><br class=""></div><div class="">function a2(e: PrimitiveString, { f: PrimitiveNumber, g: PrimitiveString }, j: PrimitiveBoolean) {}</div><div class="">```</div><div class=""><br class=""></div><div class="">and etc. For every case I should to create separate decorator? It will also isn’t comfortable. And use decorators for locals for my goal me seems also more verbose and isn’t comfortable.</div></body></html>