【问题标题】:Typescript with TypeLite - Run time type checking带有 TypeLite 的打字稿 - 运行时类型检查
【发布时间】:2013-03-24 09:29:37
【问题描述】:

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

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

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

但是,这是有问题的,因为除了 instanceof,TypeScript 不支持任何运行时类型检查工具。实例的问题是当我从服务器获取我的 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 的更多详细信息(不是必需的,但如果需要额外的上下文)

【问题讨论】:

  • 保留一个属性type 并在其中保留一个类名字符串。
  • 谢谢,这是我将做的临时解决方法,但这是有问题的,因为它不支持继承。也就是说,除非我为每种类型保留整个继承链的分隔列表,但这变得难以维护,尤其是因为我的 C# 类已转换为 TS 接口,因此分配给属性的值将在转换过程中被删除。跨度>
  • 首先,是的,就是这样。第二,如果你的核心数据模型有很深的嵌套继承关系,那就是问题的根源。不要使用继承或限制它。

标签: json typescript typelite


【解决方案1】:

在运行时您使用的是纯 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());

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

【讨论】:

  • 感谢史蒂夫,但不幸的是,我没有看到任何内置的 JS 函数可以在这里提供帮助,因为从服务器返回的需要类型检查的对象始终是纯 JSON“对象”类型。我能想象到类型检查这样一个对象的唯一方法是将它与属性模式进行比较。
  • 在这种情况下,为什么不简单地将类型描述符添加到 JSON 对象?
  • 请参阅我对 Neel 上述类似建议的回复。
  • 如果你把问题转过来怎么样 - 为什么你需要知道 UI 中的类型?你怎么能解决这个问题?
  • 将构造函数解析为字符串...谁会想到 :D 这对我有用,即使没有继承,至少没有什么可维护的。感谢您花时间解决这个问题。
猜你喜欢
  • 2018-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
  • 2018-12-27
  • 2021-01-09
  • 2021-07-10
  • 2022-11-10
相关资源
最近更新 更多