类型的最佳方法 - Typescript 前端 TCL 后端
Best approach for types - Typescript frontend TCL backend
很快我就开始为后端 (api) 是用 TCL 语言编写的相当老的应用程序重写前端。
我对我将在 Typescript 中使用的类型有一点疑问。
之前我在 NodeJS(后端)和 Typescirpt(前端)应用程序上工作,我也有类似的疑问,我只是不想在两边手动输入相同的 interfaces/types。
在研究了 Whosebug 之后,我想出了一个简单但很好的解决方案,即拥有 /shared 文件夹,它是所有类型和接口的容器。多亏了我可以在前端和后端之间共享完全相同的类型。
回到问题。
正如我所说,现在我正在使用连接到 TCL Api 的 Typescript。
问题是:
防止在 Typesript 中手动键入所有接口的最佳方法是什么?
我考虑过编写简单的 TCL type/interface 生成器(基于 TCL 连接到的数据库),但这意味着我需要始终记住“执行”类型的生成......
但是好吧,我想不出更好的办法,也许来自 Whosebug 的人会有更好的主意。
举个例子:
在后端 (api) 我有 'users' table (mysql),其中包括姓名、电子邮件、性别、role_id (它有更多,但它认为这无关紧要)
当然,我可以在 Typescript 中手动创建用户界面,但我正在寻找一种方法,而不是手动创建 :)
我的第一个想法是编写文件生成器,它将基于例如创建打字稿接口。 mysql“用户”table
如今,通常建议您使用 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 ...]
鉴于上述联系,您可以使用 table 元数据来构建接口。这会将定义写入标准输出;我不确定将其传递给 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 "};"
}
对于简单类型,这就足够了。
很快我就开始为后端 (api) 是用 TCL 语言编写的相当老的应用程序重写前端。 我对我将在 Typescript 中使用的类型有一点疑问。
之前我在 NodeJS(后端)和 Typescirpt(前端)应用程序上工作,我也有类似的疑问,我只是不想在两边手动输入相同的 interfaces/types。 在研究了 Whosebug 之后,我想出了一个简单但很好的解决方案,即拥有 /shared 文件夹,它是所有类型和接口的容器。多亏了我可以在前端和后端之间共享完全相同的类型。
回到问题。 正如我所说,现在我正在使用连接到 TCL Api 的 Typescript。 问题是: 防止在 Typesript 中手动键入所有接口的最佳方法是什么? 我考虑过编写简单的 TCL type/interface 生成器(基于 TCL 连接到的数据库),但这意味着我需要始终记住“执行”类型的生成...... 但是好吧,我想不出更好的办法,也许来自 Whosebug 的人会有更好的主意。
举个例子:
在后端 (api) 我有 'users' table (mysql),其中包括姓名、电子邮件、性别、role_id (它有更多,但它认为这无关紧要) 当然,我可以在 Typescript 中手动创建用户界面,但我正在寻找一种方法,而不是手动创建 :) 我的第一个想法是编写文件生成器,它将基于例如创建打字稿接口。 mysql“用户”table
如今,通常建议您使用 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 ...]
鉴于上述联系,您可以使用 table 元数据来构建接口。这会将定义写入标准输出;我不确定将其传递给 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 "};"
}
对于简单类型,这就足够了。