typescript - 类型的最佳方法 - Typescript 前端 TCL 后端
问题描述
很快我就开始为相当旧的应用程序重写前端,该应用程序的后端(api)是用 TCL 语言编写的。我对我将在 Typescript 中使用的类型有一点怀疑。
以前我在 NodeJS(后端)和 Typescirpt(前端)应用程序上工作,我也有类似的疑问,我只是不想在两边手动输入相同的接口/类型。在对 stackoverflow 进行了研究之后,我想出了一个简单但很好的解决方案,即拥有/shared文件夹,它是所有类型和接口的容器。多亏了这一点,我可以在前端和后端之间共享完全相同的类型。
回到问题。正如我所说,现在我正在使用连接到 TCL Api 的 Typescript。问题来了: 防止在 Typesript 中手动输入所有接口的最佳方法是什么? 我考虑过编写简单的 TCL 类型/接口生成器(基于 TCL 连接到的数据库),但这意味着我需要始终记住“执行”类型的生成......但是,没有比这更好的了,也许来自stackoverflow的人会有更好的主意。
例如:
在后端(api)我有'users'表(mysql),它由name,email,gender,role_id组成(它有更多,但它猜没关系)当然我可以在Typescript中手动创建用户界面,但是我正在寻找一种方法来解决问题,而不是手动执行 :) 我的第一个想法是编写文件生成器,这将创建基于例如 mysql 'users' 表的 typescript 接口
解决方案
现在,通常建议您使用TDBC从 Tcl 访问 MySQL。
package require tdbc::mysql
# Read the manual page for options; I really don't know what's sensible for you
set db [tdbc::mysql::connection new ...]
鉴于上述连接,您可以使用表元数据来构建接口。这会将定义写入标准输出;我不确定将其传递给 Typescript 的最佳方法是什么。
# Build an interface description from the table metadata
set TableName "Users"
puts "interface $TableName {"
dict for {columnName columnInfo} [$db columns $TableName] {
set type [dict get $columnInfo type]
# SQL has all sorts of types that you don't care about, so you will need to tweak this
# for what's actually there. Experiment!
switch $type {
bigint - integer - smallint - tinyint - double - float - numeric {
# Column is some kind of numeric type
puts " $columnName : number;"
}
char - varchar - longvarchar - text {
# Column is text
puts " $columnName : string;"
}
... ...
}
}
puts "}"
现在你有了它,你还可以构建一些对象:
$db foreach -columnsvariable c rowData "SELECT * FROM $TableName" {
# Give each value a simple unique name; you can do better!
puts "let obj_[incr index] : $TableName = {"
dict for {columnName columnData} $rowData {
set type [dict get $c $columnName type]
if {$type in {char varchar longvarchar text}} {
set quoted [string map {"\\" "\\\\" "\"" "\\\""} $columnData]
puts " $columnName : \"$quoted\","
} else {
puts " $columnName : $columnData"
}
}
puts "};"
}
对于简单的类型,这已经足够好了。
推荐阅读
- django - 使用从相关模型中过滤的 id 列表过滤模型中的数据
- javascript - 如何从嵌套在js对象数组中的数组中删除sessionID:null值对象
- node.js - React Typescript SSR 与 monorepo 项目结构
- android - 使用方向调整安卓手机屏幕亮度
- azure - React-Native 上的 Azure 室内地图
- linq - 使用 sort 参数按对象属性对列表进行排序
- python - 如何将 Spacy en_core_web_md 模型放入 Python 包中
- php - 如何使用php检查变量是否包含一组字符
- c# - 多线程和异步之间的区别
- c# - 使用 Caliburn Micro 将 WebView2 绑定到 ViewModel