-
Notifications
You must be signed in to change notification settings - Fork 12.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weβll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Allow ES Module Type-Only Imports from CJS Modules #49721
Comments
Previously discussed at #47338 (comment) - this not working is intentional since it's a forward-compat hazard. The proposed solution at the time was to add import mode assertions, but people didn't like this (see comments #48644) and we couldn't agree on a different syntax that was acceptable, so moved import mode assertions to be nightly-only. There's issue #49055 tracking next steps on this issue. |
Workaround: https://www.npmjs.com/package/@brillout/import. |
Not sure to understand why it doesn't, but for me just adding // @ts-expect-error
import type { ContainerDirective } from "mdast-util-directive"; |
In my case (building the Docusaurus framework packages), using The emitted This makes the framework users have compilation errors with ../packages/docusaurus-mdx-loader/lib/loader.d.ts:9:32 - error TS1479: The current file is a CommonJS module whose imports will produce 'require' calls; however, the referenced file is an ECMAScript module and cannot be imported with 'require'. Consider writing a dynamic 'import("unified")' call instead.
9 import type { Pluggable } from 'unified'; As far as I understand, Import attributes moved to stage 3 again with a new syntax (#53656) See also #53426 (comment) Do you think the following will fix the problem? import type { Plugin } from 'unified' with { "resolution-mode": "import" }; Can we expect it to be available soon @RyanCavanaugh ? Is there any alternative workaround to the above solution in the meantime? I tried weird workarounds like this one // @ts-expect-error: :s
async function getUnifiedPluginHack() {
const {unified} = await import('unified');
type Attachers = ReturnType<typeof unified>['attachers'];
type Attacher = Attachers[number];
type PluginP = Attacher[0];
return null as any as PluginP;
}
type Plugin = Awaited<ReturnType<typeof getUnifiedPluginHack>>; And of course it didn't work π TS error + the type is generic
|
Due to v8 of oidc-provider being ESM, we can't use the typings directly because of a TS bug: microsoft/TypeScript#49721. This works around that.
Due to v8 of oidc-provider being ESM, we can't use the typings directly because of a TS bug: microsoft/TypeScript#49721. This works around that.
Due to v8 of oidc-provider being ESM, we can't use the typings directly because of a TS bug: microsoft/TypeScript#49721. This works around that.
Isn't TS 5.3 beta fixing this issue @andrewbranch ? |
Yep! |
Due to v8 of oidc-provider being ESM, we can't use the typings directly because of a TS bug: microsoft/TypeScript#49721. This works around that.
Due to v8 of oidc-provider being ESM, we can't use the typings directly because of a TS bug: microsoft/TypeScript#49721. This works around that.
Due to v8 of oidc-provider being ESM, we can't use the typings directly because of a TS bug: microsoft/TypeScript#49721. This works around that.
Due to v8 of oidc-provider being ESM, we can't use the typings directly because of a TS bug: microsoft/TypeScript#49721. This works around that.
Due to v8 of oidc-provider being ESM, we can't use the typings directly because of a TS bug: microsoft/TypeScript#49721. This works around that.
Due to v8 of oidc-provider being ESM, we can't use the typings directly because of a TS bug: microsoft/TypeScript#49721. This works around that.
Due to v8 of oidc-provider being ESM, we can't use the typings directly because of a TS bug: microsoft/TypeScript#49721. This works around that.
Suggestion
π Search Terms
es esm module cjs commonjs type import moduleResolution node16 nodenext
β Viability Checklist
My suggestion meets these guidelines:
β Suggestion
Allow CommonJS modules to import types from ES Modules without an
async import()
ifimport types
is specified.With
moduleResolution: "node16"
enabled, we now get this very helpful error message when importing an ES Module from a CommonJS module (thank you!):However, it is often the case that module will export a types API as well as a runtime API. Sometimes, we only want to import the types from a package. Typescript has the very helpful
import type
directive to acommodate this use case. However, if we want to import the types from an ES Module, we still get the following error:Because
import type
s are stripped from runtime code, there is no need to throw this error.π Motivating Example
Because this error is thrown, it forces us to add an unnecessary async import somewhere in our file, causing non-ergonomic development at best, and unnecessary runtime complexity at worst.
Consider:
It also (very unfortunately) makes it simply impossible to create and re-export derivative types from a module like this:
π» Use Cases
See above motivating example. I'm currently using
// @ts-expect-error
to get past this, but would be great not to! This error should obviously still throw ifimportsNotUsedAsValues
is set topreserve
.The text was updated successfully, but these errors were encountered: