mlscript
mlscript copied to clipboard
TypeScript Libraries Support
Implementing ts2mls to allow using TypeScript libraries in MLscript.
Candidate TypeScript Libraries:
- https://github.com/gcanti/elm-ts
- https://github.com/gcanti/fp-ts/blob/master/src/Option.ts
- https://github.com/ionic-team/ionic-framework
- https://github.com/AykutSarac/jsoncrack.com
- https://www.npmjs.com/package/@types/lodash
TODO:
- [x] Generate MLscript declarations in new syntax for classes
- [x] Generate correct namespace structure by extending namespaces in
NewParser.scala
Is it from .ts to .mls, or .d.ts to .mls?
I think it should work with both. Right?
I think so. I can add some .d.ts tests later.
- [x] Generate type alias declaration
All interfaces are from TypeScript types.ts
- [ ] Add
private/protected
class A {
private a: number
protected b: string
}
- [ ] deal with
exportin ts
Example:
export namespace N1 {
interface IF {
foo()
}
class Base {
a: number = 10
}
export class MyClass extends Base implements IF {
foo() {}
}
}
In this case, Base will not be exported so users can't access to it. However, we still need to consider that MyClass extends the Base so we need to add a: number into MyClass
- [ ] deal with
exportin tsExample:
export namespace N1 { interface IF { foo() } class Base { a: number = 10 } export class MyClass extends Base implements IF { foo() {} } }In this case,
Basewill not be exported so users can't access to it. However, we still need to consider thatMyClassextends theBaseso we need to adda: numberintoMyClass
Also we can create an instance by calling the exported function, but we can't use new:
export namespace N1 {
class Foo {
a: number = 10
}
export function get(): Foo {
return new Foo();
}
}
let x = N1.get()
console.log(x.a)
// error!
// let y = new N1.Foo()
- [x] Fix such situation:
const none: Option<never> = { _tag: 'None' }
const some = <A>(a: A): Option<A> => ({ _tag: 'Some', value: a })
Interesting. What's the return type of N1.get() when viewed from the outside of this module/file? If it's something like N1.Foo, then that means we should still export the class, but simply make its constructor private.
Interesting. What's the return type of
N1.get()when viewed from the outside of this module/file? If it's something likeN1.Foo, then that means we should still export the class, but simply make its constructor private.
The type I got is:
symbol: <ref *1> SymbolObject {
flags: 32,
escapedName: 'Foo',
declarations: [Array],
exports: [Map],
members: [Map],
valueDeclaration: [NodeObject],
parent: undefined,
isReferenced: 788968,
id: 14
},
In the members, we can also get private/protected members. So I think we do need a private constructor. 🤔
I also find something like this in https://github.com/gcanti/fp-ts/blob/master/src/Option.ts.
export const URI = 'Option'
I think we'd better convert all stuffs rather than merely functions or interfaces.
Huh, well yeah of course we should convert these too...
(Note that the URI machinery is for higher kinded types and is used in conditional types, which we don't yet support.)
- [ ] Add
readonlysupport(mutin MLScript)
Are you planning to support mapped types, conditional types, etc.?
@kevinbarabash Yes, the plan is to eventually support arbitrary computations in types (in a way that cleanly generalizes TypeScript's various ad-hoc type computation syntaxes). However, there is a long road before we get there, as for the moment we are busy working out the basic components of the language and type system.