TypeScript Explicit module resolution

fnatzsnv  于 4个月前  发布在  TypeScript
关注(0)|答案(3)|浏览(37)

搜索词

显式模块解析
半相关: #11979

建议

具有指定在编译时替换运行时指定的模块的能力,以便在编译器时间使用一个明确的解析。在转换过程中,指令可以被省略,留下它覆盖的模块说明符不变。

用例

特别是在Deno中,我们不使用任何形式的“魔术”解析(如Node.js解析逻辑),并包含一个完全限定的模块说明符。这些信息将改变编译器的解析模块,但不会改变运行时模块说明符。应用于模块说明符的指令可以像正常一样应用,只是表示需要进行仅在编译时进行的替换。

示例

目前在Deno中,我们使用一个特殊的指令来实现这一点:@deno-types="..."。我们在TypeScript编译器解析模块时解析源文件,解析出指令的所有示例,并将其应用于从该点到下一个指令或文件末尾之间的任何import / export
所以要加载prettier,我们会这样做:

// @deno-types="./prettier/standalone.d.ts"
import "./prettier/standalone.js";

或者如果我们加载lo-dash:

// @deno-types="https://unpkg.com/@types/lodash@^4.0.0/index.d.ts"
import * as _ from 'https://cdn.pika.dev/lodash-es/v4';

所以虽然我们有适用于我们的东西,但我们认为,如果在TypeScript编译器中解决这个问题,它可能会对更广泛的社区产生好处,因为当我们更多地进入人们可能不依赖于Node.js模块解析来解析编译时和运行时路径并期望编译器知道他们的意图的情况时,这也将成为源文件解析的一部分,因此是TypeScript对文件的理解,而不是不得不“欺骗”编译器。
也许还有其他解决此问题的方法,而不仅仅是某种位置指令,因此欢迎大家提供想法和反馈。意图是“模块说明符说X很重要,但TypeScript需要告诉它解析为Y”。

检查清单

我的建议符合以下准则:

  • 这不会对现有的TypeScript/JavaScript代码造成破坏性更改
  • 这不会改变现有JavaScript代码的运行时行为
  • 这可以在不根据表达式的类型发出不同的JS的情况下实现
  • 这不是一个运行时特性(例如库功能、带有JavaScript输出的非ECMAScript语法等)
  • 这个特性将与其余的TypeScript's Design Goals一致。
t0ybt7op

t0ybt7op1#

我非常希望在Typescript中能有原生支持。

von4xj4u

von4xj4u2#

这可以通过导入属性来实现。我希望逐步淘汰Deno中的自定义// @deno-types="..."分辨率(警告使用),这样我们可以随着时间的推移摆脱Deno特定的自定义内容。

// uses `dts` instead of `types` because `types` is too similar to `type` 
import { ... } from "./other.js" with { dts: "./other.d.ts" }

// and of course
const other = await import("./other.js", { with: { dts: "./other.d.ts" }});

编辑:似乎运行时需要抛出异常,如果有任何不支持的属性 https://tc39.es/proposal-import-attributes/#sec-evaluate-import-call ——但也许运行时可以通过忽略它来支持这个功能。
编辑2:这不是一个好主意。

ecbunoof

ecbunoof3#

我在一个名为Deno的仓库中打开了denoland/deno#21195,并提出了一个使用import属性的建议。不过,如果能在这方面达成一致就更好了。
编辑:这不是一个好主意。

相关问题