很快我就开始为相当旧的应用程序重写前端,该应用程序的后端(api(是用TCL语言编写的。我对我将在Typescript中使用的类型有点怀疑。
以前我在NodeJS(后端(和Typescirpt(前端(应用程序上工作,我也有类似的疑虑,我只是不想手动在两侧键入相同的接口/类型。在研究了stackoverflow之后,我提出了一个简单但很棒的解决方案,即拥有/shared文件夹,该文件夹是所有类型和接口的容器。多亏了这一点,我可以在前端和后端之间共享完全相同的类型。
回到问题上来。正如我所说,现在我正在使用连接到TCL Api的Typescript。问题是:防止在Typesrpt中手动键入所有接口的最佳方法是什么我想过写一个简单的TCL类型/接口生成器(基于TCL连接的数据库(,但这意味着我需要永远记住";执行";生成类型。。。但是,我想不出比这更好的办法了,也许斯塔克夫弗洛的人会有更好的主意。
作为一个例子:
在后端(api(,我有一个"users"表(mysql(,它由name、email、gender、role_id组成(它有更多,但我想这无关紧要(当然,我可以在Typescript中手动创建用户界面,但我正在寻找一种方法,而不是手动创建:(我的第一个想法是编写文件生成器,它将创建基于例如mysql用户表的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 "};"
}
对于简单的类型,这就足够了。