У меня есть класс 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
}
}
Вы передаете свой SVG в виде строки конструктору?
Обновлен пост, включая передачу элемента.
Ну, document.getElementById("mySVGElement") даст вам тип HTMLElement, а не SVGSVGElement, так что у вас уже есть проблема...
Почему бы вам просто не проверить instanceof? Кроме того, как TS еще не жалуется на вызов конструктора? Argument of type 'HTMLElement' is not assignable to parameter of type 'SVGSVGElement'.? Вы, вероятно, должны сделать проверку, когда вызов конструктор.
Проблема основана на опечатке? Может быть, вы хотите SVGElement вместо SVGSVGElement? Вы можете использовать if (svg instanceof SVGElement) для проверки экземпляра элемента html.






Вы можете сделать тип параметра «любым» и затем проверить, является ли он 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-элементов.
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здесь.
Как вы передаете элемент конструктору. Пожалуйста, приведите несколько примеров, если у вас есть более одного метода.