Closed alcuadrado closed 4 years ago
thanks for the explanation :)
As I wrote in a TODO, we are gonna enable that flag in a future version of the ts config package, so this change can be simplified in the future.
could we just add esModuleInterop
to this repo's tsconfig and keep the export the same? that would skip the need for adding a future TODO. or is it better to use this import/require syntax
I tried your suggestion. It didn't work. I'm not sure why tbh
This PR fixes #267.
Here's an explanation of what I think was wrong, how I fixed, and how it can be simplified in the future.
BN and RLP are distributed as CJS modules, and use the
module.exports =
pattern. This is ok in CJS, but doesn't make sense in ESM.module.exports
is not the same asexport default
.TS has a special syntax to do that,
export = obj
.BN and RLP typings use that syntax.
To import modules using that syntax, you have to use
import A = require('A')
in ts.This module was using
import * as A from 'A'
instead, which means something like "import the module namespace" in ESM. Not that module namespace is not a class in ESM, so ts gets confused if you try to initialize it.This worked anyway, as we are just reexporting it, so no error was triggered.
When a TS project tries to use it, ts complains about this error that went unnoticed here.
This make this CSJ/ESM compatibility mess easier, TS introduced the
esModuleInterop
flag, which let you useimport A as 'A'
to import CSJ modules. This breaks the ESM semantics a bit, but it's a great trade off.As I wrote in a TODO, we are gonna enable that flag in a future version of the ts config package, so this change can be simplified in the future.