Search code examples
svgtypescriptdefinitelytypedpath-2d

Using Path2D in a TypeScript project is not resolved


I want to use the new Path2D api in a TypeScript project but I don't see it in lib.es6.d.ts What is my best course of action to use this? Does anyone have a d.ts file for Path2D?


Solution

  • I took me some time, and I made the Declaration for you:

    I've done this following the same standard TypeScript defines its interfaces internally in lib.d.ts.
    Note that you can extend this code easily for future features, and if you do I would love to see it updated here.

    Path2D.d.ts (View in TypeScript-Playground)

    // Class
    interface Path2D {
        addPath(path: Path2D, transform?: SVGMatrix);
        closePath(): void;
        moveTo(x: number, y: number): void;
        lineTo(x: number, y: number): void;
        bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): void;
        quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void;
        arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: boolean): void;
        arcTo(x1: number, y1: number, x2: number, y2: number, radius: number): void;
        /*ellipse(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, anticlockwise?: boolean): void;*/
        rect(x: number, y: number, w: number, h: number): void;
    }
    
    // Constructor
    interface Path2DConstructor {
        new (): Path2D;
        new (d: string): Path2D;
        new (path: Path2D, fillRule?: string): Path2D;
        prototype: Path2D;
    }
    declare var Path2D: Path2DConstructor;
    
    // Extend Window 
    interface Window { Path2D: Path2DConstructor; }
    
    // Extend CanvasRenderingContext2D
    interface CanvasRenderingContext2D {
        fill(path: Path2D): void;
        stroke(path: Path2D): void;
        clip(path: Path2D, fillRule?: string): void;
    }
    

    Examples:

    var canvas: HTMLCanvasElement = <HTMLCanvasElement>document.getElementById("canvas");
    var ctx = canvas.getContext("2d");
    
    var path1 = new Path2D();
    path1.rect(10, 10, 100, 100);
    
    var path2 = new Path2D(path1);
    path2.moveTo(220, 60);
    path2.arc(170, 60, 50, 0, 2 * Math.PI);
    
    var m = (<SVGSVGElement>document.createElementNS("http://www.w3.org/2000/svg", "svg")).createSVGMatrix();
    m.a = 1; m.b = 0;
    m.c = 0; m.d = 1;
    m.e = 300; m.f = 0;
    path2.addPath(path1, m);
    
    ctx.stroke(path1);
    ctx.fill(path2);