Hey guys,
I’m curious if anyone has tried this before. I thought I looked into it, and forgot what the conclusions were.
What is the possibility of being able to make TypeScript definitions for Haxe-generated JavaScript classes?
Thanks!
Hey guys,
I’m curious if anyone has tried this before. I thought I looked into it, and forgot what the conclusions were.
What is the possibility of being able to make TypeScript definitions for Haxe-generated JavaScript classes?
Thanks!
Actually yes. I’m using Waud library in my type script angular project. I needed to write the type definition myself, and it actually works well.
I once started this project but never finished it: https://github.com/nadako/hxtsdgen
Thanks guys
Have either of you run into any nasty edge cases that wouldn’t be obvious otherwise? Of course, compile-time features like Haxe abstracts aren’t available, or macros, but generating new class instances and calling standard properties (what about get/set methods?) work?
JavaScript doesn’t care if a property or a method is private or public, so to expose some privates I just defined their name in the Interface.
Creating instances, using maps and even typedefs is easy.
But I will add that I didn’t write this library, Adi wrote it and it was optimised for JavaScript.
We’re doing it here to reuse internal Haxe libs with TS.
We ran into some limits with @nadako’s lib but it could be fixed - we’ll get back to that.
I have mixed feelings about generating d.ts files for every Haxe class; I don’t think it’s very elegant when used from JS import
if you don’t have a flat class hierarchy. I’d try exposing an index.ts
re-exporting useful top-level classes.
Additionally producing a NPM module using Haxe JS with TS definitions is a tricky exercise which would be worth a good blog post.
I’m trying to get some basic TypeScript definitions working, based off the output I’m seeing from hxstdgen
{
"compilerOptions": {
"target": "es5"
},
"files": [
"openfl.d.ts",
"Test.ts"
]
}
export namespace openfl.geom {
class Rectangle {
constructor(x: number, y?: number, width?: number, height?: number);
bottom: number;
height: number;
left: number;
right: number;
top: number;
width: number;
x: number;
y: number;
clone(): openfl.geom.Rectangle;
contains(x: number, y: number): boolean;
}
}
import "./openfl";
class Test {
public static embed (div:string) {
alert (div);
let rect = new openfl.geom.Rectangle (0, 0, 100, 100);
console.log (rect);
}
}
Test.embed ("openfl-content");
I’m getting the following error:
Test.ts(11,18): error TS2552: Cannot find name ‘openfl’. Did you mean ‘open’?
I know this is likely a beginner TypeScript question, but how do I use this in the browser?
Importing doesn’t give you an openfl
variable.
import * as openfl from "./openfl";
To use in the browser: normally tsc should transform your Test.ts
into Test.js
- the import should have been translated into something like:
const openfl = require('./openfl');
Now you need to bundle Test.js
and openfl.js
into a single JS file that you can reference in an HTML page - you can use Browserify to keep things simple.
browserify src/Test.js -o www/index.js -d
© 2018-2020 Haxe Foundation - Powered by Discourse