假设我有一些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的更多详细信息(不是必需的,但如果需要额外的上下文)
答案 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());
这不会为您提供有关继承链的数据,只提供您正在检查的类。