Skip to content

JS interop: jsify and dartify #21311

Open
@tfortes

Description

JsObject.jsify currently takes a map or iterable.

...A scenario I ran into was sending a dynamic value to JS - I currently have to inspect the value to see if it should be sent to jsify or not.

Proposal: a more general jsify method (global in the js package?) that takes any Dart value (including null) and returns the "best" JS representation of it (JsObject, JsArray or unchanged for primitives)

In the opposite direction, a "dartify" method that returns usable Dart values (Map, List, or primitive) would be useful.

Here's my current work-around implementation of jsify and dartify. Note the horrible hacks I had to do.

  dynamic dartify(dynamic arg) {
    if (arg is js.JsArray) {
      return arg.toList();
    }
    if (arg is js.JsObject) {
      // TODO(tfortes): Find a better way to convert the js object to a Map.
      // https://code.google.com/p/dart/issues/detail?id=12997
      String json = js.context['JSON'].callMethod('stringify', [arg]);
      return JSON.decode(json);
    }

    return arg;
  }

  dynamic jsify(dynamic arg) {
    if (arg is Map || arg is Iterable) {
      return new js.JsObject.jsify(arg);
    }
    // Primitives are fine as-is. Other objects
    // will end up as opaque in JavaScript.
    return arg;
  }

Metadata

Assignees

No one assigned

    Labels

    area-webUse area-web for Dart web related issues, including the DDC and dart2js compilers and JS interop.library-jstype-enhancementA request for a change that isn't a bugweb-js-interopIssues that impact all js interop

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions