Как убедиться, что свойства класса имеют правильный тип в Javascript? - PullRequest
0 голосов
/ 05 июня 2018

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...