【问题标题】:How to determine type of nullable attributes on an object?如何确定对象的可为空属性的类型?
【发布时间】:2021-01-19 08:21:36
【问题描述】:

我有一个表单并且用户正在填写它,但我想允许保存不完整的表单。

在我可以将对象发送到我的 API 之前,我需要根据属性的类型是数字还是字符串,将 null 属性初始化为 0 或空字符串,否则 API 无法接受该对象.

我目前的解决方案是这样的:

    for (const property in this._object) {
        if (this._object[property] == null) {
            //need help determining if [property] is supposed to be a string or a number
        }
    }

由于 typeof 检查不适用于 null,因此无法区分字符串和数字。如何确定当前为空的对象的类型?对象类中的属性都是强类型的,所以 typescript 至少在编译时就知道类型。

【问题讨论】:

  • TypeScript 本身不关心运行时类型识别,而这正是您想要做的。您将不得不使用typeof
  • 您是如何从表单中填写您的_object 的?您应该能够在那里执行“0""”逻辑,而不是使用 for( x in y ) 循环来破解它。
  • 好吧,我依赖于用户输入,所以如果用户没有输入,则不会填充对象。重置表单也会用空值替换所有绑定值,所以我在构造函数中所做的事情并不重要。
  • 我应该补充一点,我需要填充 0 的原因是我不能将我的 int 属性中的空值发送到我的 API,因为 int 不能为空。但是,字符串也不能为 0,所以你看到了我的困境

标签: javascript typescript


【解决方案1】:

您尝试做的事情是不可能的,因为 TypeScript 类型在编译时存在。一旦代码执行,类型就已经被删除了。

实现接近您想要实现的目标的唯一方法是在表单保存数据时使用一些运行时类型信息注释您的数据(例如 { "__type": "string", "value: null } 之类的东西,或者让您的表单直接保存内存中的数据使用您需要的格式。

【讨论】:

  • 所以在编译时,Typescript 没有办法看到我想检查对象上的每个属性,如果是字符串则执行 A,如果是数字则执行 B?我可以一直手动执行硬编码 if(property == "Property A") 但这都是糟糕的代码,如果我向这个类添加属性,我必须手动更新它(我将来肯定会这样做) )
  • 没有。如果我理解正确,这是不可能的。
  • 那么人们通常如何处理这类事情呢?我现在该怎么办
  • 我回答的第二段是否已经回答了这个问题?
  • 这对于快速破解有用,但我正在尝试尽可能接近“最佳实践”解决方案。我可能最终会在我的对象类中编写一个辅助方法,将我所有为 null 的数字属性设置为 0,但是我在这里的每个选项看起来都很糟糕和糟糕
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
相关资源
最近更新 更多