Выдает ошибку, если элемент, переданный в класс, не является svg (машинопись) - PullRequest
1 голос
/ 23 марта 2019

У меня есть класс машинописного текста, который принимает элемент svg html (<svg></svg>) в качестве параметра:

export class MyClass extends Base {
  private svg: SVGSVGElement;
  constructor(svg: SVGSVGElement) {
  }
}

Вы бы назвали это в JavaScript следующим образом:

new MyClass(document.getElementById("mySVGElement"));

Проблема в том, что если я передам элемент, отличный от svg, ничего не произойдет. Как я могу выдать ошибку, если переданный элемент html не является svg? Как:

constructor(svg: SVGSVGElement) {
  if (svg not svg) {
    //throw error
  }
}

Ответы [ 6 ]

2 голосов
/ 02 апреля 2019

В машинописном тексте document.getElementById возвращает HTMLElement | null (см. здесь ), и невозможно преобразовать HTMLElement в SVGSVGElement (см. здесь и выполнить поиск " HTMLElement ").

Это означает, что вы должны «принять» правильный тип внутри параметров конструктора и «проверить» правильность внутри тела конструктора.

export class MyClass extends Base {
  private svg: SVGSVGElement;

  constructor(svg: SVGSVGElement) {
    if (svg instanceof SVGSVGElement === false) {
      throw Error()
    }

    // ...
  }
}

Здесь активно обсуждается вопрос об изменении поведения document.getElementById здесь .

2 голосов
/ 26 марта 2019

An SVGSVGElement - это правильно, верно?Как насчет if(svg instanceof SVGSVGElement){ stuff }

0 голосов
/ 31 марта 2019
export class MyClass extends Base {
    constructor(svg: SVGSVGElement) {
        if (svg instanceof SVGElement !== true) {
            throw new Error('Invalid element passed to constructor!')
        }
    }
}

Вот как должен выглядеть код, о котором говорил Стефан-Вуллемс.

0 голосов
/ 31 марта 2019
new MyClass(document.getElementById("mySVGElement"));

должно вызвать ошибку компилятора, потому что Document.getElementById возвращает HTMLElement.Таким образом, у вас уже есть безопасность типов во время компиляции.Однако, если вам все еще нужно применять это во время выполнения, то ответ Стефана должен быть каноническим способом проверки во время выполнения.

0 голосов
/ 23 марта 2019

Вы можете проверить MIME-тип файлов с помощью file.type

https://developer.mozilla.org/en-US/docs/Web/API/File/type

, вы можете просто выполнить предварительную проверку следующим образом

if (!file.type == "image/svg+xml"){
   throw new Error('FileType is invalid');
} 
0 голосов
/ 23 марта 2019

Вы можете сделать тип параметра «любым» и проверить, если он тогда svgsvgelement.

Вероятно, не самый лучший способ ..

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