将带有类型注释的python数据类转换为typescript接口并将其序列化为文件的库。

py-ts-interfaces的Python项目详细描述


py ts接口

python到typescript接口

这是什么?

这个库提供了一些实用程序,可以将python数据类转换为 对typescript接口的注释并将它们序列化为文件。

安装

python --version  # requires 3.7+
pip install py-ts-interfaces

动机

在后台使用python和typescript的web应用程序中 在前端,通常情况下,客户端将调用 后端请求一些具有特定预定义"形状"的数据。上 客户端,通常为该数据定义一个接口 后端作者使用typechecking,比如使用mypy 项目作者也可能正在键入json响应值。

这会导致代码重复。如果后端的形状改变, 相关接口也必须在前端反映其更改。AT 最好,这是恼人的维护。最坏的情况是,随着时间的推移,接口可能 分散并引起错误。

这个图书馆的目的是要有一个单一的真理来源来描述 后端和前端之间的有效负载。

用法

在python中,py ts interfaces公开了一个名为interface的新类对象。 通过子类化这个对象,您可以识别出 希望将其序列化为接口文件。

  1. 首先,连接数据类:
# views.py
from dataclasses import dataclass
from py_ts_interfaces import Interface

@dataclass
class MyComponentProps(Interface):
    name: str
    show: bool
    value: float

@dataclass
class WillNotGetPickedUp:  # this doesn't subclass Interface, so it won't be included
    name: str
    value: float
  1. 在shell中,运行包含的命令并传入文件名或 要使用的目录。默认情况下,它将输出到 名为interface.ts的目录
$ py-ts-interface views.py
Created interface.ts!

您还可以使用以下参数:

  • -o,--output[filepath]:保存文件的位置。默认为interface.ts
  • -a,--append:默认情况下,每次运行都将覆盖输出文件。这一面旗帜 只允许追加。请注意,不测试重复的接口。
  1. 生成的文件将如下所示:
// interface.ts
interface MyComponentProps {
    name: string;
    show: boolean;
    value: number;
}

为什么是@dataClass?

dataclasses是在python 3.7中引入的,它们非常棒。一些 我见过其他代码库使用的替代方法是namedtuple键入ddict。所有这些对象都试图做同一件事:组合在一起 像结构一样紧密相连的数据片段。

但是,数据类胜过其他两个,原因如下:

  1. 数据类是python内置的。在编写时,namedtuple也是 内置到输入模块中,但仍考虑使用typeddict 实验性。
  2. 不能像使用 namedtupletypeddict,例如,namedtuple可以使用类定义 继承类似于类mynamedtuple(namedtuple):…,但也类似于 mynamedtuple=namedtuple('mynamedtuple',[('name',str),('id',int])。 这是件好事。数据类要求使用类样式 声明,它不仅看起来更接近typescript接口 声明,但它避免了命名为 typeddicts用来获得它的所有特性。因为这个库使用 对代码进行ast和静态分析,以确定要序列化的数据, 这使得选择成为一个无需考虑的问题。
  3. 通过设置frozen=true,可以使数据类成为不可变的(大多数情况下)。 此库不需要它,但在以后的版本中,我们可能会提供 partialed保证不变性的数据类装饰符。
  4. 因为我们避免了namedtuples和typeddicts的元类机器,所以 打开了编写自定义类的可能性,该类允许 用一种方法进行类型检查,但是给ast解析器一些提示,以便生成不能用python轻松表示的typescript类型。

为什么用python而不是typescript定义类型?

typescript在输入语法方面比python成熟得多。 一般来说,python可以在typescript中表示任何类型, 但不是反之亦然。

因此,在python中定义类型可以保证您还可以表达 两种语言的接口。

支持的类型映射

请注意,下表中的tuv表示 实际类型的代理。它们并不表示实际使用泛型类型 变量。

<表><广告>巨蟒打印脚本< /广告><正文>无 空值str字符串int编号浮动编号复杂 编号布尔值布尔值列表 阵列<;任意>;元组 [任意]列表[t]阵列[t]元组[t,u][t,u]可选[t]t空工会[t,u,v]t u v

计划支持的映射

  • 字符串文本
  • 未定义类型
  • ISNAN类型
  • 只读类型
  • 多余属性

不支持/拒绝的映射

这个库的主要目的是帮助输入,首先是,数据 在客户端和服务器之间来回移动。这些特性中的许多,无论是特定于typescript还是python,都将无法支持。

  • 空隙
  • 可调用/函数
  • 枚举
  • 日期、日期时间、日期、时间(将它们作为字符串发送,并将它们转换为客户端上更丰富的对象)
  • 扩展
  • 泛型,类型变量
  • 交叉点类型
  • 映射类型
  • 条件类型
  • 课程

作者

christopher sabater cordero

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
无法在Netbeans 8.2 JDK8u231中创建java Maven项目(Web应用程序)   java如何以设定的时间间隔生成随机数?   java从socket和inputStream的慢速读取   spring SCORM:Java中基于Web的SCORM播放器   Java将函数传递给方法   java绑定通用服务及其实现和子类型   java如何在运行时从选择列表框中动态选择选项?爪哇硒   java Selenium WebDriver什么是“Selenium客户端和WebDriver语言绑定”   elasticsearch需要elasticsearch高级Java客户端更新ByQueryRequest API帮助   JAVA哈希表查找最大值   WSDL操作中的java soapAction属性为空   java访问封闭类或父类方法的一般方法   eclipse在java中运行带有SeleneTestCase的ANT。lang.NoClassDefFoundError   java Hazelcast不会在节点启动时填充ReplicatedMap   如何在Java中从excel中读取特定行?   html JAVA将本地时间(GMT+8)转换为UTC时间   java将自定义端点添加到Spring数据REST存储库中,并以大摇大摆的方式显示   java计算未来位置