javascript - importing goes wrong with systemjs -
i'm trying use existing js library (validate.js) in both client , server.
i installed using npm, , compiles both server , client.
when using in server works great, when execute in browser throws error.
the same file used in both cases:
import validate = require("validate.js"); export function requestvalidator(data: any): { return (validate any)(data, constraints, { allowempty: true }); }
validate
asserted any
becuase otherwise get:
ts2349: cannot invoke expression type lacks call signature.
the .d.ts
i'm using is:
declare module "validate.js" { export interface validatejs { (attributes: any, constraints: any, options?: any): any; async(attributes: any, constraints: any, options?: any): promise<any>; single(value: any, constraints: any, options?: any): any; } export const validate: validatejs; export default validate; }
the module exports function, , works in server, in client when invoking function get:
uncaught typeerror: validate not function(…)
the code compiled using target commonjs
server:
"use strict"; const validate = require("validate.js"); ...
and system
client:
system.register(["validate.js"], function(exports_1, context_1) { "use strict"; var __modulename = context_1 && context_1.id; var validate; ... return { setters:[ function (validate_1) { validate = validate_1; }], ...
when debugging it, validate
indeed isn't function it's:
validate: r empty_string_regexp: (...) empty_string_regexp: function() set empty_string_regexp: function() promise: (...) promise: function() set promise: function() __usedefault: (...) __usedefault: function() set __usedefault: function() async: (...) async: function() set async: function() capitalize: (...) capitalize: function() set capitalize: function() cleanattributes: (...) cleanattributes: function() set cleanattributes: function() ...
any idea what's going on , why behaves way in browser?
when compile "module": "system"
, node-compatible import
import validate = require("validate.js");
no longer works - value getting validate
module, not function. may bug in typescript, or design - don't know. (update: github comment addressed jsonfreeman here, looks it's design: you module object set of properties including 1 named default
).
there several ways around this.
first, can easy conversion - function need provided default
property of module, line fix it:
validate = validate.default ? validate.default : validate;
or, can compile "module": "commonjs"
browser, typescript generate working code, , systemjs detect format modules automatically.
or finally, still compile "module": "system"
, import validate.js
it's intended in typings:
import validate 'validate.js';
that way don't have casts any
, , typescript generate necessary access default
property, drawback not work @ in node when imported way.
Comments
Post a Comment