自定义转换器后,打字稿仍然使用对旧导入的引用

约瑟留利奥

我正在使用CustomTransformer更新以下项目的导入:

import { global_spacer_form_element } from '@patternfly/react-tokens';
export const disabledLabelClassNameEx = global_spacer_form_element.var;

import global_spacer_form_element from '@patternfly/react-tokens/dist/js/global_spacer_form_element';
export const disabledLabelClassNameEx = global_spacer_form_element.var;

但是,当与ts-loader我一起使用时,将获得以下输出(直接从ts-loader):

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.disabledLabelClassNameEx = void 0;
const global_spacer_form_element_1 = __importDefault(require("@patternfly/react-tokens/dist/js/global_spacer_form_element"));
exports.disabledLabelClassNameEx = react_tokens_1.global_spacer_form_element.var;
//# sourceMappingURL=Recipient2.js.map

而不是global_spacer_form_element直接使用,而是使用react_tokens_1.global_spacer_form_element

我想打字机编译器用来构建该react_tokens_1变量的转换器中缺少一些东西

转换器在其访问者中执行以下操作(为了简化说明,我正在简化转换器代码,完整的代码可以在此处查看):

const visitor: ts.Visitor = (node) => {
      if (ts.isSourceFile(node)) {
        return ts.visitEachChild(node, visitor, context)
      }
      
      if (!ts.isImportDeclaration(node) /* or if the lib name is not '@patternfly/react-tokens' */) {
        return node
      }

      // for simplicity assume we take all NamedImports and the only found is...
     const elements = ['global_spacer_form_element']
     const importPath = '@patternfly/react-tokens/dist/js/global_spacer_form_element'
     return elements.map((e) => {
       return ts.factory.createImportDeclaration(
         undefined,
         undefined,
         ts.factory.createImportClause(
           false,
           ts.factory.createIdentifier(e),
           undefined,
         ),
         ts.factory.createStringLiteral(importPath),
       )
     })
}

我的tsconfig.json

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es6",
    "allowJs": true,
    "checkJs": false,
    "jsx": "react",
    "outDir": "./build",
    "removeComments": true,
    "pretty": true,
    "skipLibCheck": true,
    "strict": true,
    "moduleResolution": "node",
    "esModuleInterop": true,
    "noImplicitAny": false,
    "sourceMap": true,
    "resolveJsonModule" : true
  },
  "include": [
    "./src/**/*"
  ],
  "exclude": [
    "./node_modules/*",
    "**/*.js"
  ]
}

最后是ts-loader配置:

{
  test: /src\/.*\.tsx?$/,
  loader: 'ts-loader',
  exclude: /(node_modules)/i,
  options: {
        getCustomTransformers: () => ({
            before: [
                tsImportPluginFactory({
                    libraryName: '@patternfly/react-tokens',
                    libraryDirectory: 'dist/js',
                   camel2DashComponentName: false
                })
            ]
        })
  }

对我还需要更新什么或可以检查什么以确保该变压器按预期工作的任何想法?

编辑:对旧导入的引用已消失,但是在新导入也得到转换之前,我没有注意到:例如从foobarfoobar_1

大卫·谢瑞

TypeScript编译器具有四个主要阶段-解析,绑定,类型检查和发射。绑定是解析标识符之间的关系的地方,但是转换发生在“发射”阶段。因此,当您进行转换时,为时已晚,编译器已经弄清楚了要转换的标识符。

一种方法是遍历文件中的所有节点,找到与导入中的一个匹配的标识符,然后通过返回context.factory.createIdentifier(node.escapedText)该节点的访问者来重新创建这些标识符这将使编译器在发出时保持原样。

不过,问题可能出在文件中哪些标识符引用了已命名的导入标识符。通常,我不建议在转换中使用类型检查器,因为当文件上发生多个转换时,它可能导致意外的结果,但是您可能可以先检查标识符是否escapeText匹配,然后再检查是否typeChecker.getSymbolAtLocation(node)?.declarations[0]等于在原始导入声明中找到的命名的导出标识符。另外,我认为您将必须实施自己的范围分析。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

自定义转换器后,打字稿仍然使用对旧导入的引用

来自分类Dev

自定义转换器后,打字稿仍然使用对旧导入的引用

来自分类Dev

自定义转换器后,打字稿仍然使用对旧导入的引用

来自分类Dev

使用自定义转换器映射对象类型

来自分类Dev

如何正确导入打字稿中的自定义类型

来自分类Dev

自定义转换后如何将内容传递给jekyll默认转换器?

来自分类Dev

Typesafe的配置是否支持自定义转换器?

来自分类Dev

如何调试自定义转换器

来自分类Dev

Maven Shade插件自定义转换器

来自分类Dev

为DocumentDb设置自定义json转换器

来自分类Dev

改装2的自定义转换器

来自分类Dev

自定义通用json转换器未调用

来自分类Dev

调试自定义XAML转换器

来自分类Dev

Spring Cache抽象和自定义转换器

来自分类Dev

自定义转换器的Jooq结果

来自分类Dev

Typesafe的配置是否支持自定义转换器?

来自分类Dev

自定义json转换器json.net

来自分类Dev

自定义布尔转换器以设置样式类

来自分类Dev

AngularJS - 为视图创建自定义转换器

来自分类Dev

自定义转换器模型隐私

来自分类Dev

如何在自定义转换器中访问sklearn列转换器

来自分类Dev

未使用自定义HTTP消息转换器,未支持的媒体类型为415

来自分类Dev

使用JSON.NET实现自定义DateTime转换器

来自分类Dev

哈斯克尔。如何使用GADT实施自定义monad转换器?

来自分类Dev

在Spring MVC项目中使用带有自定义消息转换器的springdoc

来自分类Dev

捕获文本框的无效输入并使用自定义转换器

来自分类Dev

在selectCheckboxMenu中对自定义对象使用转换器不起作用

来自分类Dev

使用自定义转换器从流中反序列化Json

来自分类Dev

从ajax向控制器发布数据后未调用自定义JSON转换器

Related 相关文章

  1. 1

    自定义转换器后,打字稿仍然使用对旧导入的引用

  2. 2

    自定义转换器后,打字稿仍然使用对旧导入的引用

  3. 3

    自定义转换器后,打字稿仍然使用对旧导入的引用

  4. 4

    使用自定义转换器映射对象类型

  5. 5

    如何正确导入打字稿中的自定义类型

  6. 6

    自定义转换后如何将内容传递给jekyll默认转换器?

  7. 7

    Typesafe的配置是否支持自定义转换器?

  8. 8

    如何调试自定义转换器

  9. 9

    Maven Shade插件自定义转换器

  10. 10

    为DocumentDb设置自定义json转换器

  11. 11

    改装2的自定义转换器

  12. 12

    自定义通用json转换器未调用

  13. 13

    调试自定义XAML转换器

  14. 14

    Spring Cache抽象和自定义转换器

  15. 15

    自定义转换器的Jooq结果

  16. 16

    Typesafe的配置是否支持自定义转换器?

  17. 17

    自定义json转换器json.net

  18. 18

    自定义布尔转换器以设置样式类

  19. 19

    AngularJS - 为视图创建自定义转换器

  20. 20

    自定义转换器模型隐私

  21. 21

    如何在自定义转换器中访问sklearn列转换器

  22. 22

    未使用自定义HTTP消息转换器,未支持的媒体类型为415

  23. 23

    使用JSON.NET实现自定义DateTime转换器

  24. 24

    哈斯克尔。如何使用GADT实施自定义monad转换器?

  25. 25

    在Spring MVC项目中使用带有自定义消息转换器的springdoc

  26. 26

    捕获文本框的无效输入并使用自定义转换器

  27. 27

    在selectCheckboxMenu中对自定义对象使用转换器不起作用

  28. 28

    使用自定义转换器从流中反序列化Json

  29. 29

    从ajax向控制器发布数据后未调用自定义JSON转换器

热门标签

归档