当我们使用C#
时,我们可以使用Code-First方法以强类型方式访问我们的数据库:
public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; }
public virtual List<Post> Posts { get; set; }
}
...
public class Database : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
var db = new Database()
var blog = new Blog { Name = "My new blog", BlogId = 1 };
db.Blogs.Add(blog);
db.SaveChanges(); // save object to database
编译器将确保我们只访问现有的属性/方法,并且我们在代码中的每个地方都使用正确的类型。
如何对TypeScript
和Node.JS
进行同样的操作?
我找到了Knex.JS
和bookshelf
个库用于数据库访问,但我找不到任何关于如何将它们与强类型TypeScript
对象和类一起使用的示例。
答案 0 :(得分:13)
我在网上搜索了有关如何将Bookshelfjs与Typescript一起使用的示例,并且没有可以提供帮助的文章或博客文章。我确实发现在github上作为DefinatelyTyped test file的一部分分发测试,这是一个很好的起点。此外,您很可能希望将每个模型存储在自己的文件中,这需要Bookshelfjs注册表插件。 This article解释了为什么,但在常规javascript环境中。
将所有内容放在一起,假设您已正确安装knexjs和bookshelfjs的输入法。使用您的代码作为灵感,请进一步阅读:
您可能有一个名为“Config.ts”的文件,其中包含所有数据库详细信息:
import * as Knex from 'knex';
import * as Bookshelf from 'bookshelf';
export class Config {
private static _knex:Knex = Knex({
client: 'mysql',
connection: {
host : '127.0.0.1',
user : 'your_database_user',
password : 'your_database_password',
database : 'myapp_test',
charset : 'utf8'
}
});
private static bookshelf:Bookshelf = Bookshelf(Config.knex);
public static bookshelf(): Bookshelf {
Config.bookshelf.plugin('registry');
return Config._bookshelf;
}
}
您可能有一个名为“Blog.ts”的文件来保存Blog模型(另一个名为“Post.ts”以保存Post模型):
import {Config} from './Config';
import {Post} from './Post';
export class Blog extends Config.bookshelf.Model<Blog>
{
get tableName() { return 'books'; }
// strongly typed model properties linked to columns in table
public get BlogId(): number {return this.get('id');}
public set BlogId(value: number) {this.set({id: value})}
public get Name(): string {return this.get('name');}
public set Name(value: string) {this.set({name: value});}
posts(): Bookshelf.Collection<Post> {
return this.hasMany(Post);
}
}
module.exports = Server.bookshelf.model('Blog', Blog);
在你的“App.ts”文件中,你可以运行你的代码:
import {Config} from './Config';
import {Blog} from './Blog';
var blog = new Blog();
blog.set({ Name : "My new blog", BlogId : 1 });
.save();
我没有在这里测试过代码,所以我可能会有一些小错字,但你明白了。请注意,我已经为类属性使用了标题大小写,但我在数据库字段中使用了snake case。对于Bookshelf开箱即用,必须遵守某些命名约定,例如每个表的Id字段被称为'id',关系的外键具有单个版本的表名(例如对于users表,表中的Id会是'id'但登录表中的外键是'user_id')。
无论如何,最好的方法是弄清楚如何使用TypeScript思想使用Bookshelfjs(鉴于缺少关于该主题的文档),将结合DefinatelyTyped typedef bookshelf.d查看Bookshelfjs文档。 ts文件。
答案 1 :(得分:2)
是否要求目前无法获得的东西 但是,实际上可以做到!你将不得不做一些努力工作!
正如您(可能)所知,TypeScript仅在开发时使用,没有任何内容进入运行时,因此您要求对数据库结构进行类型验证。
您必须创建一个在typescript编译器之前运行的构建步骤,这个新的构建步骤应该从您的数据库结构中生成一个d.ts文件。它应该连接到数据库,调查它,并输出描述其结构的接口。
请注意,此结构将根据您使用的数据库而更改...
另一种解决方案是自己手动创建d.ts文件,一旦数据库结构发生变化,您还必须在定义文件中反映(手动)。
答案 2 :(得分:1)
您可以在github上的DefinitelyTyped存储库中找到许多js库的类型定义。
您还可以使用找到here的 tsd 工具将这些定义文件添加到项目中。
简而言之,您需要在终端中运行这4个命令。
$ npm install tsd -g
$ tsd init
$ tsd install knex
$ tsd install bookshelf