Выдать ошибку, если элемент, переданный классу, не является SVG (машинопись)

У меня есть класс typescript, который принимает элемент 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
  }
}

Как вы передаете элемент конструктору. Пожалуйста, приведите несколько примеров, если у вас есть более одного метода.

Sachin Gupta 26.03.2019 14:04

Вы передаете свой SVG в виде строки конструктору?

Michael Doye 26.03.2019 14:35

Обновлен пост, включая передачу элемента.

Adam.V 26.03.2019 14:37

Ну, document.getElementById("mySVGElement") даст вам тип HTMLElement, а не SVGSVGElement, так что у вас уже есть проблема...

Michael Doye 26.03.2019 14:40

Почему бы вам просто не проверить instanceof? Кроме того, как TS еще не жалуется на вызов конструктора? Argument of type 'HTMLElement' is not assignable to parameter of type 'SVGSVGElement'.? Вы, вероятно, должны сделать проверку, когда вызов конструктор.

Roberto Zvjerković 26.03.2019 15:24

Проблема основана на опечатке? Может быть, вы хотите SVGElement вместо SVGSVGElement? Вы можете использовать if (svg instanceof SVGElement) для проверки экземпляра элемента html.

Dakota Jang 28.03.2019 20:29
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
1
6
248
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

Хотя, наверное, не лучший способ..

Вы можете проверить тип 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');
} 

Будет ли <svg></svg> считаться файлом? Я думаю, что мой вопрос больше касается html-элементов.

Adam.V 23.03.2019 17:39
Ответ принят как подходящий

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

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

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

export class MyClass extends Base {
    constructor(svg: SVGSVGElement) {
        if (svg instanceof SVGElement !== true) {
            throw new Error('Invalid element passed to constructor!')
        }
    }
}

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

В машинописном тексте 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здесь.

Другие вопросы по теме