2013-10-02 108 views
1

我有一个遗留数据库,我想通过全新的API公开。使用Typescript映射数据库模式

我需要将模型的字段名称从遗留数据库映射到我的新模型类。

我想以类型安全的方式做到这一点,而不是仅仅使用容易出错的字符串映射字典。

// The new model. 
class Patient { 
    firstName: string 
    lastName: string 
    dateOfBirth: Date 
} 

var p: Patient; 

legacyToNewModelMappings = 
    "First Name": p.firstName 
    "Family Name": p.familyName 
    "DOB": p.dateOfBirth 

这是很好的,因为如果我在新的模式改变字段,重构将是容易的,我会在我的IDE得到一个警告,如果有一个问题。

但是我需要能够在两个模型之间来回映射。使用引用虽然意味着我不能从遗留数据库映射到新数据库。

我在Node.js中使用TypeScript。

我应该看的任何其他方法?

+0

您是指从新数据库返回到旧数据库?这是一个JavaScript问题,与TypeScript无关。您的映射需要双向,但JavaScript对象散列只有单向。因此,您必须在两个方向上构建两个映射词典,或者对某个方向使用属性搜索(可能是最少使用的一个)。一些JavaScript库包含一个“反向对象”函数,它构建一个新对象,用属性值切换属性值 - 在这种情况下,您将创建一个映射,然后“反向”以获取其他方向。 –

+0

另外,您的legacyToNewModelMappings不起作用。这将使用构建映射对象时作为属性当前值的值构建映射。如果您不想在TypeScript类上使用属性名称索引,通常会生成两个函数setLegacyToNewModel()和getLegacyFromNewModel(),它们在属性名称上包含switch语句。 –

回答

1

我想了解你在这里完成的任务,所以如果我错了,请纠正我。

难道你不能在一个模型上使用getters和setter来匹配两个数据库的字段名称的属性吗?

class Patient { 
    public firstName: string; 
    public lastName: string; 
    public dateOfBirth: Date; 

    get "First Name"(): string { 
     return this.firstName; 
    } 
    get "Family Name"(): string { 
     return this.familyName; 
    } 
    get "DOB"(): Date { 
     return this.dateOfBirth; 
    } 

    set "First Name" (value: string) { 
     this.firstName = value; 
    } 
    set "Family Name" (value: string) { 
     this.familyName = value; 
    } 
    set "DOB" (value: Date) { 
     this.dateOfBirth = value; 
    } 
} 
+0

哇,谢谢你!我不知道在Typescript中获取和设置语法。这看起来不错。 – vaughan