TypeScript 生成函数

Posted

技术标签:

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

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

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

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

现在我的想法是生成另一个文件/类,它是用于处理生成的接口的实用函数,在这种情况下,它只不过是一个getInterfaceName(),它将返回一个带有所有已加载数据的 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
    

谢谢

【问题讨论】:

【参考方案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$filenameConfig(): $filenameConfig 
    const jsonString = ...; // Load json file
    const $filenameObject = JSON.parse(jsonString);

    return $filenameObject as $filenameConfig;
  `);

const imports = importLines.join('\n');
const body = functions.join('\n\n');
const result = `$imports\n\n$body`;
// Write result to file

【讨论】:

以上是关于TypeScript 生成函数的主要内容,如果未能解决你的问题,请参考以下文章

通过生成构造函数将超类注入原始对象

在 TypeScript 中推断泛型函数类型

来做操吧!深入 TypeScript 高级类型和类型体操

typeScript函数篇

Typescript:如何正确处理 axios 请求?

当在 2 个连续的行中调用两次时,Faker 正在生成重复数据(Typescript)