hkust-taco / mlscript

The MLscript programming language. Functional and object-oriented; structurally typed and sound; with powerful type inference. Soon to have full interop with TypeScript!
https://hkust-taco.github.io/mlscript
MIT License
147 stars 24 forks source link

TypeScript Libraries Support #134

Open NeilKleistGao opened 2 years ago

NeilKleistGao commented 2 years ago

Implementing ts2mls to allow using TypeScript libraries in MLscript.

Candidate TypeScript Libraries:

NeilKleistGao commented 2 years ago

TODO:

chengluyu commented 2 years ago

Is it from .ts to .mls, or .d.ts to .mls?

LPTK commented 2 years ago

I think it should work with both. Right?

NeilKleistGao commented 2 years ago

I think so. I can add some .d.ts tests later.

NeilKleistGao commented 1 year ago
NeilKleistGao commented 1 year ago

All interfaces are from TypeScript types.ts

NeilKleistGao commented 1 year ago
class A {
    private a: number
    protected b: string
}
NeilKleistGao commented 1 year ago

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

NeilKleistGao commented 1 year ago
  • [ ] deal with export in 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

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() 
NeilKleistGao commented 1 year ago
const none: Option<never> = { _tag: 'None' }
const some = <A>(a: A): Option<A> => ({ _tag: 'Some', value: a })
LPTK commented 1 year ago

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.

NeilKleistGao commented 1 year ago

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.

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. 🤔

NeilKleistGao commented 1 year ago

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.

LPTK commented 1 year ago

Huh, well yeah of course we should convert these too...

LPTK commented 1 year ago

(Note that the URI machinery is for higher kinded types and is used in conditional types, which we don't yet support.)

NeilKleistGao commented 1 year ago
kevinbarabash commented 1 year ago

Are you planning to support mapped types, conditional types, etc.?

LPTK commented 1 year ago

@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.