MyScript / iinkTS

Other
41 stars 4 forks source link

[suggestion] friendly type declaration #4

Closed rnike closed 3 days ago

rnike commented 2 months ago

We are on iink-ts@2.0.0-alpha.6, and the type of element is not so friendly. Typescript cannot recognize the element type in switch case

Screenshot 2024-07-02 at 10 52 23 AM

Here is a rough example to make this library easier to use (I didn't look forward to the entire types, might miss something)

interface TJIIXBase {
  'bounding-box'?: TBoundingBox;
  items?: TJIIXStrokeItem[];
}

interface TJIIXElementBase<T = string> extends TJIIXBase {
  id: string;
  type: T;
}

interface TJIIXNodeElementBase<T extends ShapeKind>
  extends TJIIXElementBase<'Node'> {
  kind: T;
}

interface TJIIXNodeCircle extends TJIIXNodeElementBase<ShapeKind.Circle> {
  cx: number;
  cy: number;
  r: number;
}

interface TJIIXNodeEllipse extends TJIIXNodeElementBase<ShapeKind.Ellipse> {
  cx: number;
  cy: number;
  rx: number;
  ry: number;
}

interface TJIIXNodeRectangle extends TJIIXNodeElementBase<ShapeKind.Rectangle> {
  height: number;
  width: number;
  x: number;
  y: number;
}

interface TJIIXNodeTriangle extends TJIIXNodeElementBase<ShapeKind.Triangle> {
  id: string;
  type: 'Node';
  kind: ShapeKind.Triangle;
  points: number[];
}
interface TJIIXNodeParrallelogram
  extends TJIIXNodeElementBase<ShapeKind.Parallelogram> {
  points: number[];
}

interface TJIIXNodePolygon extends TJIIXNodeElementBase<ShapeKind.Polygon> {
  points: number[];
}

interface TJIIXNodeRhombus extends TJIIXNodeElementBase<ShapeKind.Rhombus> {
  points: number[];
}

type TJIIXNodeElement =
  | TJIIXNodeCircle
  | TJIIXNodeEllipse
  | TJIIXNodeRectangle
  | TJIIXNodeTriangle
  | TJIIXNodeParrallelogram
  | TJIIXNodePolygon
  | TJIIXNodeRhombus;

interface TJIIXTextElement extends TJIIXElementBase<'Text'> {
  'bounding-box'?: TBoundingBox;
  label: string;
  words?: TJIIXWord[];
  chars?: TJIIXChar[];
}

interface TJIIXEdgeElementBase<T = EdgeKind> extends TJIIXElementBase<'Edge'> {
  kind: T;
}

interface TJIIXEdgeLine extends TJIIXEdgeElementBase<EdgeKind.Line> {
  kind: EdgeKind.Line;
  x1: number;
  x2: number;
  y1: number;
  y2: number;
  p1Decoration?: EdgeDecoration;
  p2Decoration?: EdgeDecoration;
}

interface TJIIXEdgeArc extends TJIIXEdgeElementBase<EdgeKind.Arc> {
  cx: number;
  cy: number;
  rx: number;
  ry: number;
  phi: number;
  startAngle: number;
  sweepAngle: number;
  startDecoration?: EdgeDecoration;
  endDecoration?: EdgeDecoration;
}

type TJIIXEdgeElement = TJIIXEdgeLine | TJIIXEdgeArc;
type TJIIXElement = TJIIXNodeElement | TJIIXTextElement | TJIIXEdgeElement;

Using the types above, we can get the correct type in switch case or if statement using typescript

Screenshot 2024-07-02 at 10 52 04 AM

Screenshot 2024-07-02 at 10 47 15 AM

leJsboureau commented 2 months ago

thank you very much for this suggestion, we will take it in the next version

leJsboureau commented 3 days ago

New version (2.0.0) with your suggestion. Thank you for your feedback.