Как убедиться, что свойства класса имеют правильный тип в Javascript?

Istlemin спросил: 12 мая 2018 в 04:01 в: javascript

Я только начинаю с создания более серьезных проектов в 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 ответ

Есть решение
Jonas W. ответил: 12 мая 2018 в 04:09

Вы можете немного его создать и использовать реальные геттеры / сеттеры, чтобы украсить все это немного:

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; }
}

Но если это все еще некрасиво, просто используйте машинопись или поток.