NodeJS和类限制

时间:2019-01-04 20:08:19

标签: javascript node.js

我想知道是否有一种方法可以在NodeJ中的CLASS中处理以下情况。我有一个类,可以称其为contact,它具有一堆字符串字段,但也具有例如一组电子邮件类。我不能在JavaScript中指定值实际上应该是另一个类的数组,因为我无法在JavaScript中指定数据类型。另外,如何限制类中字段的值,例如我的电子邮件类具有一个名为type的字段,该字段可以是“ home | work | other”

2 个答案:

答案 0 :(得分:2)

使用“香草” JavaScript,没有特定的方法告诉Array应该仅用另一个特定类的对象填充 。数组(以及其他任何数据结构)实际上将接受您所抛出的任何内容。这是完全有效的JS(尽管通常来说您不会经常这样做):

var array1 = [1, 'two', {three: true}, [4]];

如果您对类型安全性感兴趣,可以查看类似Typescript的信息,但这不是必需的,并且如果您只是在学习JS生态系统的工作原理,则可能会使事情变得更加复杂。

答案 1 :(得分:2)

尽管Javascript不会为您提供静态类型,但是由于您使用的是Node,并且可以控制使用的版本,因此您还有其他选择。您可以使用代理。如果您的电子邮件数组是代理,则可以控制设置器,并且仅允许添加要添加的内容。例如(不确定此代码片段是否将在所有浏览器中运行):

class Email {
  constructor(addr) {
    this.address = addr
  }
}

// proxy array to check for values on set
let emails = new Proxy([], {
  set: function(target, property, value, receiver) {
    if (!(value instanceof Email)) {
      if (property != "length")
        console.log(`Array can only contain Email instances "${value}" is an incompatible type`)
      return true
    }
    target[property] = value;
    return true;
  }
});

// fails
emails.push(1)
console.log("current array:", emails)

// works
let e = new Email("test@example.com")
emails.push(e)
console.log("current array:", emails)

// fails
emails[0] = "test"
console.log("current array:", emails)