4

假设我有一些 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"
           }
     });
});

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

目前我发现的唯一一件事就是这个,但它没有记录,没有维护,并且使用我零经验的节点,所以我会为自己省去挫折感。有没有人知道类似在 TypeScript 中执行运行时类型检查或其他方式来完成我所追求的事情?

如果将其内置到 TypeLite 中以生成接口以及用于在运行时进行类型检查的 JSON 模式,那就太好了。因为这个项目是开源的,所以应该有人真的继续扩展它。如果我自己做的话,我至少需要一些指示(因此是问题)。

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

4

1 回答 1

3

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

如何在 JavaScript 中获取对象类型的名称?

这是一个TypeScript get-class-name 实现,它可以提供封闭的 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());

这不会给你关于继承链的数据,只是你正在检查的类。

于 2013-04-03T06:00:42.850 回答