Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Typescript AMD implementation bad with Javascript / RequireJS

If I have this ts module:

export function say(){
    console.log("said");
}

and I compile it with the amd option I can use it quite easily from a ts client :

import foo = module("tsmodule")
foo.say();

export var x = 123;

However if I have javascript equivalent to the ts module:

define(["require", "exports"], function(require, exports) {
    function say() {
        console.log("said");
    }
    exports.say = say;
})

There is no way to use it easily. The simplest possible solution:

// of course you can use .d.ts for requirejs but that is beside the point
declare var require:any;

// will fail with error module has not been loaded yet for context
// http://requirejs.org/docs/errors.html#notloaded
var useme = require("jsmodule")
useme.say();

export var x = 123;
import foo = module("tsmodule")
foo.say();

fails because of error http://requirejs.org/docs/errors.html#notloaded . Since "jsmodule" was not passed to the define call in the generated typescript.

The two workarounds I have

  • don't use import / export (language features lost)
  • use require([]) (still can't export something that depends on the require([]) call)

have limitations : https://github.com/basarat/typescript-requirejs . Is there another way? If not can you vote here : https://typescript.codeplex.com/workitem/948 :)

like image 709
basarat Avatar asked Oct 22 '22 11:10

basarat


1 Answers

If you want to load in a JavaScript module you could always use the (badly documented) amd-dependency tag:

/// <amd-dependency path="jsmodule" />

This will put jsmodule in the dependency array of your define call.

And then provide a declaration file in which you would simply state

module useme {
    function say(): void;
}
like image 121
thomaux Avatar answered Oct 27 '22 11:10

thomaux