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 生成函数的主要内容,如果未能解决你的问题,请参考以下文章