Как использовать преобразование svg.js с параметром матрицы в машинописи?

Когда я использую svg.js lib с javascript, я могу преобразовать данный элемент через SVG.Matrix вот так:

import * as SVG from 'svg.js';

let draw = SVG('drawing').size(200, 200);
let rect = draw.rect(100, 100).attr({ fill: '#f06' });
rect.translate(100,100);
let matrix = new SVG.Matrix(rect);
let rect2 = draw.rect(100, 100).attr({ fill: '#f60' });
rect2.transform(matrix);

В этом примере 2-й прямоугольник преобразуется как первый прямоугольник через SVG.Matrix:

<svg id="SvgjsSvg1001" width="200" height="200" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.com/svgjs"><defs id="SvgjsDefs1002"></defs><rect id="SvgjsRect1008" width="100" height="100" fill="#ff0066" transform="matrix(1,0,0,1,100,100)"></rect><rect id="SvgjsRect1009" width="100" height="100" fill="#ff6600" transform="matrix(1,0,0,1,100,100)"></rect></svg>

Однако тот же код в печатных текстах утверждает:

[ts]
Argument of type 'Matrix' is not assignable to parameter of type 'Transform'.
  Types of property 'skewX' are incompatible.
    Type '(x: number, cx?: number, cy?: number) => Matrix' is not assignable to type 'number'.

Как я могу преобразовать элемент через SVG.Matrix в машинописи? Почему svgjs.Element.transform вести себя иначе, когда используется с тс?

1 ответ

Решение

svg.js.d.ts говорит, что Element.transform имеет эту подпись:

interface Element {
    transform(t: Transform, relative?: boolean): Element;
    transform(): Transform;
    ...
}

Итак, это должно работать:

const transform = rect.transform();
let rect2 = draw.rect(100, 100).attr({ fill: '#f60' });
rect2.transform(transform);

По сути, оба Transform а также Matrix объекты имеют свойства /b/c/d/e/f, поэтому в Javascript один может использоваться вместо другого, но в Typescript они не имеют прототипного отношения, и компилятор жалуется.

Это на самом деле ошибка в наборе. Глядя на исходный код, преобразование осуществляется путем вызова new Matrix(t)так что подпись .transform() должен прочесть:

transform(t: MatrixAlias, relative?: boolean): Element;
Другие вопросы по тегам