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);

拍摄于此: https://github.com/Microsoft/TypeScript/wiki/Using-the-Compiler-API#user-content-creating-and-printing-a-typescript-ast

您可以使用此工具使用 swagger 在 Typescript 中生成 API。 https://github.com/unchase/Unchase.OpenAPI.Connectedservice/

相关: * NSwagStudio