类型的最佳方法-Typescript前端TCL后端

时间:2020-07-16 05:31:09

标签: typescript tcl typescript-typings

很快,我将开始为相当老的应用程序重写前端,该后端(api)用TCL语言编写。 对于在Typescript中使用的类型,我有一点疑问。

以前,我在NodeJS(后端)和Typescirpt(前端)应用程序上工作,我也有类似的疑问,我只是不想手动在双方上手动键入相同的接口/类型。 在这里对stackoverflow进行研究之后,我想到了一个简单但很棒的解决方案,即拥有 / shared 文件夹,该文件夹是所有类型和接口的容器。因此,我可以在前端和后端之间共享完全相同的类型。

回到问题。 正如我所说,现在我正在使用连接到TCL Api的Typescript。 这是一个问题: 防止在Typesript中手动键入所有接口的最佳方法是什么? 我考虑过要编写简单的TCL类型/接口生成器(基于TCL连接到的数据库),但这意味着我将需要始终记住“执行”类型的生成... 但是好吧,我没有想到的更好,也许来自stackoverflow的人会有更好的主意。

例如:

在后端(api)上,我有'users'表(mysql),该表由名称,电子邮件,性别,role_id组成(它有更多,但猜测没有关系) 当然,我可以在Typescript中手动创建用户界面,但是我正在寻找一种更好的方法,而不是手动进行:) 我的第一个想法是编写文件生成器,该文件生成器将基于例如mysql“用户”表

1 个答案:

答案 0 :(得分:1)

这几天,通常建议您使用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 "};"
}

对于简单类型,这已经足够了。