【问题标题】:Best approach for types - Typescript frontend TCL backend类型的最佳方法 - Typescript 前端 TCL 后端
【发布时间】:2020-11-05 17:31:23
【问题描述】:

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

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

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

例如:

在后端(api)我有“用户”表(mysql),它由姓名、电子邮件、性别、角色 ID 组成(它有更多,但它认为没关系) 当然我可以在 Typescript 中手动创建用户界面,但我正在寻找一种方法,而不是手动创建:) 我的第一个想法是编写文件生成器,它将基于例如创建 typescript 接口。 mysql“用户表”

【问题讨论】:

  • 您是否计划对后端 api 进行版本控制?
  • 我想生成东西是正确的方法,但你的问题感觉有点太笼统,现在无法回答。您能否添加一个示例来说明您想要生成的内容以及您想从哪里开始?
  • @DonalFellows 我描述了我想做的例子
  • 谢谢。这一切听起来有点 ORM-y,所以我将不得不猜测一下。

标签: typescript tcl typescript-typings


【解决方案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 "};"
}

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

【讨论】:

  • 警告!这是未经测试的代码,因为我既没有 MySQL,也没有任何 Typescript 经验;我不得不从文档和其他 SO 问题中猜测很多......
  • 另外,这绝不是 ORM!这只是尝试映射表并覆盖数据快照的基本代码。
  • 这是一个很好的答案!非常感谢!
猜你喜欢
  • 2018-12-29
  • 2019-12-10
  • 2016-03-17
  • 2021-05-08
  • 2020-07-28
  • 2018-04-11
  • 2020-03-11
  • 1970-01-01
  • 2021-06-19
相关资源
最近更新 更多