【问题标题】:TypeScript generate functionTypeScript 生成函数
【发布时间】:2021-09-17 04:23:53
【问题描述】:

我正在开发一个工具来为我生成一些样板代码。

我们的想法是解析位于名为 config 的文件夹中的所有 .json 文件,并为每个文件生成接口以及一些辅助功能。

quicktype 包的帮助下生成接口很容易。

现在我的想法是生成另一个文件/类,它是用于处理生成的接口的实用函数,在这种情况下,它只不过是一个get{InterfaceName}(),它将返回一个带有所有已加载数据的 InterfaceType 对象来自 .json 文件。

我不是打字稿专家,但在 Java 世界中,我想我可以使用反射来实现这一点。

非常感谢任何有关如何做到这一点的意见,或者即使有可能。

test.json

{
    "key" : "value"
}

test.d.ts

export interface TestConfig {
    key: string;
}

utils.ts

function getTestConfig() {
    // Load json file, etc
    return {
        key: jsonData.key
    }
}

谢谢

【问题讨论】:

    标签: node.js typescript code-generation


    【解决方案1】:

    如果我理解正确,您只需要阅读 json 并为其提供正确的接口吗?让我们分解一下:

    加载 json 文件

    要加载 .json 文件,您需要 nodejs 的 fs package。为方便起见,建议使用promises variation

    将json字符串转换为对象

    在 javascript 中有一个内置类:

    JSON.parse(jsonFileStringFromPreviousStep);
    

    声明接口

    Assertion 是一种让 typescript 知道变量属于某种类型/接口的方法。由于您已经通过 quicktype 从文件中构建了接口,因此将接口断言到已解析的对象上应该是安全的。

    function getTestConfig(): TestConfig {
        const jsonString = ;// Load json file
        const testObject = JSON.parse(jsonString);
        
        return testObject as TestConfig;
    }
    

    使用 getObjectConfig 方法生成文件

    您必须在要用于配置的目​​录中获得list of json files。那么它应该是一个简单的字符串模板解决方案。您必须处理样式约定(PascalCase/camelCase 等),但这应该是微不足道的。

    const importLines: string[] = [];
    const functions: string[] = [];
    const files = ...; // get list of files via fs.readDir
    for (const filename of files) {
      importLines.push(`import ${filename} from '.....pathToInterfaces/${filename}.d.ts';`);
      functions.push(
        `function get${filename}Config(): ${filename}Config {
        const jsonString = ...; // Load json file
        const ${filename}Object = JSON.parse(jsonString);
    
        return ${filename}Object as ${filename}Config;
      }`);
    }
    const imports = importLines.join('\n');
    const body = functions.join('\n\n');
    const result = `${imports}\n\n${body}`;
    // Write result to file
    

    【讨论】:

      猜你喜欢
      • 2018-02-07
      • 2013-02-21
      • 2018-04-27
      • 2018-12-04
      • 2021-12-28
      • 2017-05-15
      • 2023-03-31
      • 1970-01-01
      • 2019-01-11
      相关资源
      最近更新 更多