TypeScript 有代码生成 API 吗?
Is there code generation API for TypeScript?
当我需要生成一些 C# 代码时,例如来自 xsd 架构的 DTO 类,或 excel table,我使用了一些 roslyn API的。
打字稿有类似的东西吗?
[编辑]:我最终使用了 ts-morph
Is there something simmilar for typescript
还没有,但是 TypeScript 团队正在开放 emitter (what is that) for plugins that would make this a supported scenario : https://github.com/Microsoft/TypeScript/issues/5595
尝试ts-morph。只用了一个小时左右,但它看起来真的很强大。
import {Project, Scope, SourceFile} from "ts-morph";
const project = new Project();
const sourceFile = project.createSourceFile(`./target/file.ts`);
const classDeclaration = sourceFile.addClass({
name: 'SomeClass'
});
const constr = classDeclaration.addConstructor({});
constr.setBodyText('this.myProp = myProp');
classDeclaration.addProperty({
name: 'myProp',
type: 'string',
initializer: 'hello world!',
scope: Scope.Public
});
sourceFile.formatText();
console.log(sourceFile.getText());
当我们需要使用 Angular 4 和 TypeScript 添加对使用我们的 RESTful APIs 到 MEAN 堆栈的支持时,我们使用 http://editor.swagger.io 并传入JSON 版本的 Swagger 2.0 API 定义,然后为 TypeScript 选择客户端生成器。
当然我们有点作弊,因为我们首先使用 SZ Architech (http://www.solution.zone) 创建 RESTful APIs,它使用 SwaggerUi 来记录生成了 APIs,并允许我们仅复制 Swagger 2.0 定义以将 Swagger 的代码生成用于客户端代码。
截至 2018 年 10 月您可以使用标准 TypeScript API
import ts = require("typescript");
function makeFactorialFunction() {
const functionName = ts.createIdentifier("factorial");
const paramName = ts.createIdentifier("n");
const parameter = ts.createParameter(
/*decorators*/ undefined,
/*modifiers*/ undefined,
/*dotDotDotToken*/ undefined,
paramName
);
const condition = ts.createBinary(
paramName,
ts.SyntaxKind.LessThanEqualsToken,
ts.createLiteral(1)
);
const ifBody = ts.createBlock(
[ts.createReturn(ts.createLiteral(1))],
/*multiline*/ true
);
const decrementedArg = ts.createBinary(
paramName,
ts.SyntaxKind.MinusToken,
ts.createLiteral(1)
);
const recurse = ts.createBinary(
paramName,
ts.SyntaxKind.AsteriskToken,
ts.createCall(functionName, /*typeArgs*/ undefined, [decrementedArg])
);
const statements = [ts.createIf(condition, ifBody), ts.createReturn(recurse)];
return ts.createFunctionDeclaration(
/*decorators*/ undefined,
/*modifiers*/ [ts.createToken(ts.SyntaxKind.ExportKeyword)],
/*asteriskToken*/ undefined,
functionName,
/*typeParameters*/ undefined,
[parameter],
/*returnType*/ ts.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword),
ts.createBlock(statements, /*multiline*/ true)
);
}
const resultFile = ts.createSourceFile(
"someFileName.ts",
"",
ts.ScriptTarget.Latest,
/*setParentNodes*/ false,
ts.ScriptKind.TS
);
const printer = ts.createPrinter({
newLine: ts.NewLineKind.LineFeed
});
const result = printer.printNode(
ts.EmitHint.Unspecified,
makeFactorialFunction(),
resultFile
);
console.log(result);
您可以使用此工具使用 swagger 在 Typescript 中生成 API。
https://github.com/unchase/Unchase.OpenAPI.Connectedservice/
相关:
* NSwagStudio
当我需要生成一些 C# 代码时,例如来自 xsd 架构的 DTO 类,或 excel table,我使用了一些 roslyn API的。
打字稿有类似的东西吗?
[编辑]:我最终使用了 ts-morph
Is there something simmilar for typescript
还没有,但是 TypeScript 团队正在开放 emitter (what is that) for plugins that would make this a supported scenario : https://github.com/Microsoft/TypeScript/issues/5595
尝试ts-morph。只用了一个小时左右,但它看起来真的很强大。
import {Project, Scope, SourceFile} from "ts-morph";
const project = new Project();
const sourceFile = project.createSourceFile(`./target/file.ts`);
const classDeclaration = sourceFile.addClass({
name: 'SomeClass'
});
const constr = classDeclaration.addConstructor({});
constr.setBodyText('this.myProp = myProp');
classDeclaration.addProperty({
name: 'myProp',
type: 'string',
initializer: 'hello world!',
scope: Scope.Public
});
sourceFile.formatText();
console.log(sourceFile.getText());
当我们需要使用 Angular 4 和 TypeScript 添加对使用我们的 RESTful APIs 到 MEAN 堆栈的支持时,我们使用 http://editor.swagger.io 并传入JSON 版本的 Swagger 2.0 API 定义,然后为 TypeScript 选择客户端生成器。
当然我们有点作弊,因为我们首先使用 SZ Architech (http://www.solution.zone) 创建 RESTful APIs,它使用 SwaggerUi 来记录生成了 APIs,并允许我们仅复制 Swagger 2.0 定义以将 Swagger 的代码生成用于客户端代码。
截至 2018 年 10 月您可以使用标准 TypeScript API
import ts = require("typescript");
function makeFactorialFunction() {
const functionName = ts.createIdentifier("factorial");
const paramName = ts.createIdentifier("n");
const parameter = ts.createParameter(
/*decorators*/ undefined,
/*modifiers*/ undefined,
/*dotDotDotToken*/ undefined,
paramName
);
const condition = ts.createBinary(
paramName,
ts.SyntaxKind.LessThanEqualsToken,
ts.createLiteral(1)
);
const ifBody = ts.createBlock(
[ts.createReturn(ts.createLiteral(1))],
/*multiline*/ true
);
const decrementedArg = ts.createBinary(
paramName,
ts.SyntaxKind.MinusToken,
ts.createLiteral(1)
);
const recurse = ts.createBinary(
paramName,
ts.SyntaxKind.AsteriskToken,
ts.createCall(functionName, /*typeArgs*/ undefined, [decrementedArg])
);
const statements = [ts.createIf(condition, ifBody), ts.createReturn(recurse)];
return ts.createFunctionDeclaration(
/*decorators*/ undefined,
/*modifiers*/ [ts.createToken(ts.SyntaxKind.ExportKeyword)],
/*asteriskToken*/ undefined,
functionName,
/*typeParameters*/ undefined,
[parameter],
/*returnType*/ ts.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword),
ts.createBlock(statements, /*multiline*/ true)
);
}
const resultFile = ts.createSourceFile(
"someFileName.ts",
"",
ts.ScriptTarget.Latest,
/*setParentNodes*/ false,
ts.ScriptKind.TS
);
const printer = ts.createPrinter({
newLine: ts.NewLineKind.LineFeed
});
const result = printer.printNode(
ts.EmitHint.Unspecified,
makeFactorialFunction(),
resultFile
);
console.log(result);
您可以使用此工具使用 swagger 在 Typescript 中生成 API。 https://github.com/unchase/Unchase.OpenAPI.Connectedservice/
相关: * NSwagStudio