Giter Site home page Giter Site logo

Comments (8)

alexeagle avatar alexeagle commented on May 19, 2024

This seems like a bug in closure compiler. Looking into the type at runtime, it claims to have kind==CONSTRUCTOR when the @type is present. If it's removed, it goes back to kind==ORDINARY.

from clutz.

alexeagle avatar alexeagle commented on May 19, 2024

Ben says
"/** @type {!Function} */ is new-able as well as callable, so in some
sense it's both a constructor and an ordinary function."

from clutz.

rkirov avatar rkirov commented on May 19, 2024

I didn't know that in closure all functions are newable. TS plain functions are not new-able, so we have to make it explicitly new-able with

interface ClosureFunction {
  (...args: any[]):any;
  new (...args: any[]): any;
}

var abstractMethod: ClosureFunction; 

from clutz.

mprobst avatar mprobst commented on May 19, 2024

In Closure, function() is a different type from Function. The first is a specific function that can only be called in a specific way, with particular arguments, e.g. function() being a function that takes no args and is void, function(string): number being a function taking a single string, returning a number. A function that's constructable but restricts it's arguments looks like this: function(new:Foo, number, string). Similarly, you can also specify function(this:SomeType).

Function is a weak type assertion that something is any subtype of Function, so could or could not be callable with new and/or any args. JSCompiler allows calling these in any way.

from clutz.

alexeagle avatar alexeagle commented on May 19, 2024

The problem seems to be that the information was lost. Introspecting the type system tells us only that the thing is modelled as a class, but not whether it was declared with @constructor.
If we make all these things a class, they will appear to be newable but not callable.
Maybe we need to emit all of them as callable-newable like @rkirov wrote above.

from clutz.

mprobst avatar mprobst commented on May 19, 2024

Can we get to the JSDocInfo field? That has the @constructor thing in it, I'd hope.

Otherwise we could also just special case on tempCtor and fail if somebody really calls their super class tempCtor (which violates the style guide and common sense ;-)).

from clutz.

rkirov avatar rkirov commented on May 19, 2024

I am changing my original proposal, since this is a rare pattern and honestly new-able + callable sounds like trouble. I suggest ignoring the new-able semantics and just outputting it as var foo: Function; for now.

We have only seen 2 places where this is used (goog.reflect.sinkValue and goog.abstractMethod) and neither is very useful when called with new.

from clutz.

mprobst avatar mprobst commented on May 19, 2024

Yeah, this seems like a corner case, and as you can specify explicitly when something should be newable, the intent would probably never be to actually call new on one of these.

from clutz.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.