TypeLite的Typescript - 运行时类型检查

时间:2013-04-02 21:51:11

标签: json typescript typelite

假设我有一些C#DTO,我希望使用T4模板和称为TypeLite的整洁小库将它们转换为TypeScript接口

在客户端,我有一些具体的TypeScript类(继承自Backbone.Model,但这并不重要)代表服务器端定义的相同DTO。

接口的预期目标是充当数据合同并确保客户端和服务器DTO保持同步。

但是,这是有问题的,因为TypeScript不支持instanceof以外的运行时类型检查工具。实例的问题是当我从服务器获取我的DTO时它们是普通的JSON对象而不是我的模型的实例。我需要对从服务器作为JSON对象进入的这些DTO执行运行时类型检查。

我知道我可以这样做:

collection.fetch({...}).done((baseModels) => {
     baseModels.forEach((baseModel) => {
           if(baseModel&& baseModel.SomeProperty && baseModel.SomeOtherProperty){
                //JSON model has been "type-checked"
           }
     });
});

但是,这有明显的问题,因为如果我更改或添加属性,现在我需要在三个位置更新。

目前我找到的唯一的东西是this,但它没有记录,没有维护,并使用我没有经验的节点,所以我会拯救自己的挫折感。有没有人知道类似于在TypeScript中执行运行时类型检查或以其他方式完成我所追求的事情?

如果将这个内置到TypeLite中以生成接口以及在运行时进行类型检查的JSON模式,那将会很棒。由于这个项目是open source,有人应该继续并扩展它。如果我自己做的话,我至少需要一些指针(因此问题)。

有关我的特定问题here的更多详细信息(不是必需的,但如果需要额外的上下文)

1 个答案:

答案 0 :(得分:3)

在运行时,您使用的是纯JavaScript,因此您可以使用此答案,因为它与纯JavaScript相关:

How do I get the name of an object's type in JavaScript?

这是一个TypeScript get-class-name implementation,它可以提供封闭的TypeScript类的名称(该链接也具有此示例的静态单独版本)。

class ShoutMyName {
    getName() { 
        var funcNameRegex = /function (.{1,})\(/;
        var anyThis = <any> this;
        var results = (funcNameRegex).exec(anyThis.constructor.toString());
        return (results && results.length > 1) ? results[1] : "";
    }
}

class Example extends ShoutMyName {
}

class AnotherClass extends ShoutMyName {
}

var x = new Example();
var y = new AnotherClass();

alert(x.getName());
alert(y.getName());

这不会为您提供有关继承链的数据,只提供您正在检查的类。