iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Typescript中interface自动化生成API文档详解
  • 279
分享到

Typescript中interface自动化生成API文档详解

typescript 生成文档typescript apitypescript的interface 2022-12-27 09:12:25 279人浏览 薄情痞子
摘要

目录前言UI层面数据层面我们需要的数据结构简单解释一下jsdoc格式AST解析技术选择为什么放弃babelts-morph自动化生成代码总结前言 最近在搞React组件库,这两天搞定

前言

最近在搞React组件库,这两天搞定了使用ast(抽象语法树)去把interface转为对象或者数组,这些数据就可以渲染为react组件的table或者markdown的table,啥意思呢,举个例子:

UI层面

以下是interface的demo,被转化

export interface TdAffixProps {
  
  container: any;
  
  offsetBottom?: number;
  
  offsetTop?: number;
  
  zIndex?: number;
  
  onFixedChange?: (affixed: boolean, context: { top: number }) => void;
}

转化为类似:

数据层面

interface被转化为数组,数组里的每一项如下,可以传给table组件去渲染,当然有人想渲染为markdown格式,那把下面的数组渲染为markdown的table就行了,没啥难度。

{
  "name": "TdAffixProps",
  "data": [
    {
      "name": "container",
      "type": "any",
      "jsdoc": {
        "kind": 24,
        "description": "指定滚动的容器。数据类型为 String 时,会被当作选择器处理,进行节点查询。示例:'body' 或 () => document.body",
        "tags": [
          {
            "kind": 25,
            "tagName": "default",
            "text": "() => (() => window)"
          }
        ]
      }
    },
    {
      "name": "offsetBottom",
      "type": "number",
      "isOptionnal": "?",
      "jsdoc": {
        "kind": 24,
        "description": "",
        "tags": [
          {
            "kind": 25,
            "tagName": "desc",
            "text": "距离容器顶部达到指定距离后触发固定"
          },
          {
            "kind": 25,
            "tagName": "default",
            "text": "0"
          }
        ]
      }
    },
    {
      "name": "offsetTop",
      "type": "number",
      "isOptionnal": "?",
      "jsdoc": {
        "kind": 24,
        "description": "",
        "tags": [
          {
            "kind": 25,
            "tagName": "desc",
            "text": "距离容器底部达到指定距离后触发固定"
          },
          {
            "kind": 25,
            "tagName": "default",
            "text": "0"
          }
        ]
      }
    },
    {
      "name": "zIndex",
      "type": "number",
      "isOptionnal": "?",
      "jsdoc": {
        "kind": 24,
        "description": "",
        "tags": [
          {
            "kind": 25,
            "tagName": "desc",
            "text": "固钉定位层级,样式默认为 500"
          }
        ]
      }
    },
    {
      "name": "onFixedChange",
      "type": "(affixed: boolean, context: { top: number }) => void",
      "isOptionnal": "?",
      "jsdoc": {
        "kind": 24,
        "description": "",
        "tags": [
          {
            "kind": 25,
            "tagName": "desc",
            "text": "固定状态发生变化时触发"
          }
        ]
      }
    }
  ]
}

我们需要的数据结构

上面可以看到,我们需要的数据结构是

{
    name: xxx, // interface的名字,
    data: [
        {
          name: xx, // interface里每一项的属性名
          type: xx,  // interface里每一项的类型
          isOptionnal: xx, // 是否是可选项
          jsDoc: {} // 后面细说
        }
    ]
}

简单解释一下jsdoc格式

JSDoc是一种文档生成工具,可以用来为javascript代码生成api文档。它使用特殊的注释格式来描述代码中的类型、函数、变量等的用途、参数、返回值等信息。

例如,你可以在JavaScript代码中使用如下的注释来描述一个函数:


function sum(x, y) {
  return x + y;
}

这段注释会被解析为:

   {
        "kind": 24, // 忽略
        "description": "描述文字",
        "tags": [
          {
            "kind": 25, // 忽略
            "tagName": "default",
            "text": 0
          }
        ]
      }

AST解析技术选择

为什么放弃babel

最开始我只知道babel,因为用webpack多了,不太了解ast相关的前端库,然后很正常的这样使用了,发现了问题:

const parser = require("@babel/parser")
const traverse = require("@babel/traverse").default
const generate = require('@babel/generator').default
const fs = require("fs")

fs.readFile('./type.ts', { encoding: 'utf-8' }, function (err, data) {
  if (err) throw err;
  const result = [];
  const ast = parser.parse(data, {
    sourceType: "unambiguous",
    plugins: ["typescript"]
  });
  traverse(ast, {
    TSInterfaceDeclaration(path) {
      path.traverse({
        TSPropertySignature(path) {
          console.log(path.node.key.name);
          console.log(path.node.leadinGComments?.[0]?.value);
        },
      });
    }
  });

});

比如number这个类型在上述打印节点的时候的类型是TSNumberKeyWord,但是我拿到TSNumberKeyword不是目的,我要number,这个咋办,

你说简单啊,做个映射

{
  TSNumberKeyword: "number"
}

好,我知道简单的映射可以,但是还有function类型,我咋映射,我需要还原的嘛,然后我想到了直接用generator把类型片段还原,但是总感觉有点low。

其次,我没法直接获得jsdoc的类型,因为注释本质上就是字符串,然后自己去折腾为jsdoc格式。

所以我去看了一下arco cli里的转换使用到了ts-morph这个库,发现这个库在我这个需求下,是非常适合的,接下来介绍。

顺便提一句,我的实现比字节团队的arco cli要简单非常非常多!

ts-morph

这个库极大的缓解了不懂typescript繁琐底层类型和方法的同学,具体的方法和属性真的也是挺多的。ts-morph是一个针对 Typescrpit/Javascript的AST处理库,可用于浏览、修改TS/JS的AST。

关于ts-morph的详细文档,参见其官网:ts-morph.com/。

下面是我实现的基本思路(可以把里面的函数抽取为中间件,这样更好维护,目前懒得改了,类型没认真写,大家可以在我的基础上自己封装适合自己业务的东西,思路还是很清晰的),后续会把它抽成一个单独的库给自己的react组件库使用。

以下代码说白了就一个简单函数,arco官方的cli工具虽然代码也就200行的样子,但是复杂度比我这个高很多。

自动化生成代码

import { Project } from "ts-morph";

const internalProject = new Project({
  tsConfigFilePath: "./tsconfig.JSON",
});

const sourceFile = internalProject.getSourceFile("./type.ts");
const interfaces = sourceFile!.getInterfaces();

const result:any[] = [];
interfaces.forEach((inter_face)=>{
  result.push({
    name: '',
    data: []
  });
  const index = result.length - 1;
  result[index].name = inter_face.getName();

  inter_face.getProperties().forEach((v) => {
    result[index].data.push({
      name: v.getName(),
      type: v.getTypeNode()?.getText(),
      isOptionnal: v.getQuestionTokenNode()?.getText(),
      jsdoc:v.getJsDocs().map((jsDoc)=>{
        return (jsDoc.getStructure())
       })[0]
    });    
  });
})
console.log(result);

总结

到此这篇关于Typescript中interface自动化生成API文档的文章就介绍到这了,更多相关Typescript自动化生成API文档内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Typescript中interface自动化生成API文档详解

本文链接: https://www.lsjlt.com/news/175896.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Typescript中interface自动化生成API文档详解
    目录前言UI层面数据层面我们需要的数据结构简单解释一下jsdoc格式AST解析技术选择为什么放弃babelts-morph自动化生成代码总结前言 最近在搞react组件库,这两天搞定...
    99+
    2022-12-27
    typescript 生成文档 typescript api typescript的interface
  • SpringBoot如何自动生成API文档详解
    前言 在做项目的时候,如果项目是前后分离的,后端一定要和前端或者是移动端对接接口,那么问题来了,接口是不是要自己写给他们看,一般的会采用Excel或者Word来写,高级一点的就采用A...
    99+
    2024-04-02
  • Babel自动生成Attribute文档实现详解
    目录1. 前言2. 开发自动生成属性文档插件2.1 生成Babel插件模板:2.2 转换思路详解:2.3 单元测试用例:2.4 AST分析详解:2.5 插件开发过程:2.5.1 定义...
    99+
    2022-11-13
    Babel生成Attribute文档 Babel Attribute
  • SpringBoot是怎么自动生成API文档的
    这篇文章主要讲解了“SpringBoot是怎么自动生成API文档的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot是怎么自动生成API文档的”吧!前言在做项目的时候,如果项...
    99+
    2023-06-20
  • Laravel使用Apidoc注解自动生成Api接口文档
    本教程从零开始搭建laravel项目,并安装Apidoc扩展及使用注解生成Api接口文档的教程,该扩展支持 多应用/版本、Markdown文档、在线接口调试、接口生成器、代码模板生成器、Mock调试数...
    99+
    2023-09-05
    laravel php doc 后端 api
  • SpringBoot怎么整合Swagger Api自动生成文档
    本篇内容主要讲解“SpringBoot怎么整合Swagger Api自动生成文档”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot怎么整合Swagger Api自动生成文档”吧!...
    99+
    2023-06-20
  • 解析如何自动化生成vue组件文档
    目录一、现状二、社区解决方案2.1、业务梳理三、技术方案3.1、Vue文件解析3.2、信息提取3.2.1、可直接获取的信息3.2.2、需要约定的信息四、总结五、展望一、现状 Vue框...
    99+
    2024-04-02
  • spring boot集成smart-doc自动生成接口文档详解
    目录前言功能特性1 项目中创建 /src/main/resources/smart-doc.json配置文件2 配置内容如下(指定文档的输出路径)3 pom.xml下添加配置4 运行...
    99+
    2024-04-02
  • SpringBoot如何优雅的整合Swagger Api自动生成文档
    目录前言 整合swagger api 自定义配置信息 简单使用 Swagger常用注解Api标记 ApiOperation标记 ApiParam标记 ApiModel标记 ApiMo...
    99+
    2024-04-02
  • SpringBoot的API文档生成工具SpringDoc使用详解
    目录前言SpringDoc简介使用集成从SpringFox迁移结合SpringSecurity使用测试常用配置总结参考资料前言 之前在SpringBoot项目中一直使用的是Spri...
    99+
    2024-04-02
  • django怎么自动生成接口文档
    Django没有内置的功能来自动生成接口文档,但是可以使用第三方工具来实现自动生成接口文档。 以下是一些常用的自动生成接口文档的工具...
    99+
    2023-10-23
    django
  • 自动生成typescript类型声明工具实现详解
    目录一、实现的功能二、工具使用方法三、实现思路四、使用示例🚲简单的JSON 数据🚲输出对应简单的类型定义✈复杂的JSON 数据✈输出对应复杂类型定义五、具体实现代码六、写在最后 在T...
    99+
    2023-05-14
    自动生成typescript类型声明 typescript类型声明
  • SpringBoot2配置Swagger2生成API接口文档详情
    目录一、Swagger2介绍二、配置Swagger21、引入相关依赖2、创建swagger的配置类3、在启动类上添加注解扫描swagger的配置类,进行测试4、API模型5、定义接口...
    99+
    2024-04-02
  • Python自动化办公之Word文档的创建与生成
    目录保存生成 word生成标题生成段落添加图片添加表格分页上几章节我们主要学习了如何读取文章,而主要任务是读取文档中的文本信息,也就是字符串,而图片本身是不可读的文件所以并没有去读取...
    99+
    2024-04-02
  • SpringBoot使用swagger生成api接口文档的方法详解
    目录前言具体例子maven配置项目application.yml配置springApplication添加swagger注解在控制层添加swagger注解前言 在之前的文章中,使用m...
    99+
    2022-11-13
    SpringBoot swagger生成api接口文档 SpringBoot 生成api接口文档 SpringBoot swagger
  • Babel怎么实现自动生成Attribute文档
    本篇内容主要讲解“Babel怎么实现自动生成Attribute文档”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Babel怎么实现自动生成Attribute文档”吧!1. 前言利用Babel自动...
    99+
    2023-07-04
  • Python自动化办公之Word文档怎么创建与生成
    这篇文章主要介绍了Python自动化办公之Word文档怎么创建与生成的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python自动化办公之Word文档怎么创建与生成文章都会有所收获,下面我们一起来看看吧。保存生...
    99+
    2023-06-30
  • 一文详解Golang如何生成Excel文档
    本篇文章给大家带来了关于Golang的相关知识,其中主要跟大家介绍怎么用Golang生成Excel文档 ,感兴趣的朋友下面一起来看一下吧,希望对大家有帮助。基于数据生成 Excel 文档是一个很常见的需求,本文将介绍如何使用 Go 的 Ex...
    99+
    2023-05-14
    Excel 后端 Go
  • 怎么给ABAP类自动生成帮助文档
    本篇内容主要讲解“怎么给ABAP类自动生成帮助文档”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么给ABAP类自动生成帮助文档”吧!Social media 在SP0开发的时候,建了CL_SO...
    99+
    2023-06-04
  • vue组件文档生成备注详解
    目录vue组件文档生成备注内容实现Vuese自动生成vue组件文档安装Vuese在根目录下新增配置文件 .vueserc在package.json新增脚本,并启动vue组件文档生成备...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作