网站搜索

json - TypeScript 与 TypeLite - 运行时类型检查


假设我有一些 C# DTO,我想使用 T4 模板和一个叫 TypeLite 的小巧库将它们转换为 TypeScript 接口

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

这些接口的预期目标是作为数据契约,并确保客户端和服务器的 DTO 保持同步。

然而,这存在问题,因为 TypeScript 除了 instanceof 之外不支持任何运行时类型检查功能。instanceof 的问题在于,当我从服务器获取我的 DTO 时,它们只是普通的 JSON 对象,而不是我的模型实例。我需要对这些从服务器作为 JSON 对象传来的 DTO 进行运行时类型检查。

我知道我可以做这样的事情:

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

然而,这显然存在问题,因为现在如果我更改或添加一个属性,我需要在三个地方进行更新。

目前我只找到这个,但它没有文档,也没维护,而且用的是我完全没经验的Node,所以我就省去那种挫败感了。有人知道有什么类似的在TypeScript里进行运行时类型检查,或者其他实现我想要的功能吗?

如果能将其内置到 TypeLite 中,以生成接口以及用于运行时类型检查的 JSON 模式,那将非常棒。既然这个项目是开源的,真的应该有人去扩展它。如果我自己去做的话,至少需要一些指导(因此提出这个问题)。

关于我这里具体问题的更多细节(不是必须的,但如果需要的话可以提供额外的背景)

答案#1

在运行时,你正在使用纯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());

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

相关文章