Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Properties in a module

Is there a way to define a property in a TypeScript module?

None of these compile:

module My {
    // doesnt work
    get Value(): number { return 42; }

    // doesn't work either
    get function Value(): number { return 42; }

    // nope
    function get Value(): number { return 42; }
}

Right now I'm forced to use this:

module My {
    declare var Value: number;
    Object.defineProperty(My, "Value", {
        get: () => 42
    });
}

The second form seems messy to me and the code hinting doesn't really treat it as a read-only property but as a plain variable.

Is there any standard way of defining properties directly inside modules?

like image 389
Acidic Avatar asked Jan 04 '14 19:01

Acidic


People also ask

In which of the file we can define the module properties?

Module properties can be specified in a TRA properties file or on the command line at design time. A property value set on the command line overrides the same property value set in the properties file.

Are Python modules objects?

A module is a Python object with arbitrarily named attributes that you can bind and reference. The Python code for a module named aname normally resides in a file named aname.py, as covered in Module Loading. In Python, modules are objects (values) and are handled like other objects.

At what level are user properties defined in Tibco bw6?

Properties defined in the inner layer can reference a property defined at its parent layer. For example, a process property can reference a module property instead of providing a literal value. Similarly, a module property value can be defined by literal values or source from its parent scope application property.


1 Answers

No, there's not a way to declare a property on a module in TypeScript using any documented language features.

You can do it in several slightly round-about techniques.

A module can extend an existing class or function. So, I've created a class with a static property, and then later created a module that uses the same name as the class.

class My
{
    static get Value():Number {
        return 42;
    }
}

module My {
    var works: boolean = true;
}

alert(My.Value);

It does generate one oddity in the JavaScript generated code that you wouldn't do manually (and should be removed by most optimizers anyway) ... it will redeclare the variable My when the module is created. This does not cause a run-time issue as the variable was already lifted in JavaScript and will not conflict with the first usage.

Here's another option:

module Global {
    class Inner {
        get Value():Number {
            return 42;
        }       
    }   
    export var My;
    My = new Inner();
}

var My = Global.My;
alert(My.Value);

While it presents an extra namespace, you can manipulate it however you'd like and use the inner class or change it as needed. This way, the My variable is global, just like it would be as a module.

like image 137
WiredPrairie Avatar answered Sep 28 '22 11:09

WiredPrairie