2017-01-13 10 views
0

studentというデータベーステーブルがあります。TypeScriptを使用してデータベースのスキーマとモデルをマッピングする方法は?

id | name | createdAt | deleted 
-------------------------------- 
1 | foo | 2017-01-13 | false 

データベースから値を取得するときに、正しい値にマッピングされた値が取得されます。私はこのテーブルのためのインタフェースを持っている:

interface Student { 
    id: number; 
    name: string; 
    createdAt: Date; 
    deleted: boolean; 
} 

私が何かやっているデータベースから値をつかむために:私はを参照するためにハードコードされた文字列を置換する方法を考えてい

await knex('student').where('deleted', false); 

をテーブル/カラムのため、列の名前を変更/削除し、実行時ではなくコンパイル時に問題を検出することができます。

const tables = { student: 'student' }; 
const cols = { 
    id: 'id', 
    name: 'name', 
    createdAt: 'createdAt', 
    deleted: 'deleted', 
}; 

await knex(tables.student).where(cols.deleted, false); 

のようなオブジェクトを作成しました。しかし、このアプローチの問題は、誰かがモデルインターフェース(Student)を変更してcolsオブジェクトの変更を忘れると、コンパイル時にはまだ動作するということです。

const cols: Studentを実行すると、すべての列が検証されますが、colsオブジェクトのすべての列の型は文字列である必要があります。

これを行う方法はありますか?多分、このラインから、あるいはまったく別のアプローチで?

答えて

1

新しい2.1.0のフィーチャーで本当に簡単に修正できます。

const tables = { student: 'student' }; 
const cols: { [P in keyof Student]: string } = { 
    id: 'id', 
    name: 'name', 
    createdAt: 'createdAt', 
    deleted: 'deleted', 
}; 

await knex(tables.student).where(cols.deleted, false); 

これは、学生を変更したが、colsオブジェクトを変更しない場合には不平を言います。私はその後、実行時に(フィールドタイプのフィールド名とtypeためdbName)のデータから、あなたのインターフェイスStudentを生成する、次の

interface MetaDataDescription { 
    dbName: string; 
    type: any; 
} 

class StudentMetaData { 
    static ID: MetaDataDescription = {dbName: 'id', type: number}; 
    static NAME: MetaDataDescription = {dbName: 'name', type: string}; 
    //etc... 
} 

のようなマップのような構造を想像することができます

+0

、メタデータクラス(ES)における単一のポイントになります私は」なかったのその機能について知っている。それがまさに私が必要なものです。甘い! – BrunoLM

+1

これについてはこちらをご覧ください:https://github.com/Microsoft/TypeScript/wiki/What's-new-in-TypeScript –

0

StudentMetaDataに与えられました。 (および他のすべてのモデルでも同様)

この汎用インターフェイスのデータへのアクセスは、genericInstance[StudentMetaData.ID.dbName]のように実行され、コンパイル時の整合性が維持されます。あなたは、その後も時のチェックをコンパイル保ち、await knex(tables.student).where(StudentMetaData.DELETED.dbName, false);を記述したクエリで

..

全体の構造への変更が

+0

これは、Java EEコードのように見えない場所によく似ています。 TypeScript機能を使用してそれを行うにはいくつかの方法がありますが、複雑でまだタイプされていない安全なOOシステムを設計する必要はありません。 –

+0

OK、 'genericInstance [StudentMetaData.ID.dbName]'に代入するときに型の安全性を失います。しかし、 'keyof'キーワードはかなり滑らかですが、あなたはまだあなたの解決策で物事を2回書くことになります。 – Sebastian

+0

確かに、私の答えは彼のコードを修正するだけです。私は個人的にちょうど別の場所でそれを修正するだろう。 Studentのキーだけを受け入れるようにwhere()関数を正しくタイプすることができます。しかし、私は彼がアーキテクチャやライブラリに関して何を使用しているのかよくわからないので、私は実際にはその解決策を提示することはできません。 私の答えがあなたのbtwよりも優れていると言っているわけではありません。私の味のために。 –

関連する問題