如何确保类属性在Javascript中是正确的类型?

时间:2018-06-05 17:41:01

标签: javascript oop types

我刚刚开始在javascript中制作一些更严肃的项目,我觉得无类型正在成为一个问题。具体来说,我经常发现我的类是以错误的类型启动的,这个错误最好应该很容易修复,但有时会花费我很多时间。这就是为什么我想知道:在javascript中是否存在断言类属性的类型正确的做法?就像在这个例子中一样(a应该总是一个字符串,b应该始终是类Bar的一个实例,而c应该总是一个数字):

class Foo {
    constructor(a,b,c){
        if(typeof a !== "string"){
            throw "Wrong type";
        }
        this.a = a;
        if(!(b instanceof Bar)){
            throw "Wrong type";
        }
        this.b = b;
        if(typeof c !== "number"){
            throw "Wrong type";
        }
        this.c = c;
    }

    setA(a){
        if(typeof a !== "string"){
            throw "Wrong type";
        }
        this.a = a;
    }

    setB(b){
        if(!(b instanceof Bar)){
            throw "Wrong type";
        }
        this.b = b;
    }

    setC(c){
        if(typeof c !== "number"){
            throw "Wrong type";
        }
        this.c = c;
    }
}

这感觉就像是一种糟糕的方式,因为它非常麻烦和重复,并且只是抛出“错误的类型”也感觉很奇怪。有关于此的最佳做法吗?这个问题通常会被忽略吗?

我试图对此进行研究,但未能找到甚至提及此问题的内容。

此外,我知道这可能是一个非常主观的问题,可能不适合这个网站。在这种情况下,有没有人指出我应该问这个问题的地方?

1 个答案:

答案 0 :(得分:1)

你可以稍微使用它并使用真正的getter / setter来美化整个事情:

const assert = (val, is) => { 
   if(typeof value !== is) 
     throw new Error(`WrongType: ${val} for ${is}`);
};

class Test {
  constructor(a) {
    this.a = a;
  }

  set a(v) { assert(v, "string"); this._a = v; }
  get a(){ return this._a; }
}

但如果那仍然难看,只需使用打字稿或流程。