导入节点模块导出默认类导致'模块'而不是'构造函数'

时间:2017-05-29 17:27:48

标签: javascript typescript webpack ecmascript-6 es6-modules

我正在尝试导入节点模块React-Signature-Pad。 index.js文件如下所示:

import PropTypes from 'prop-types'
import React, { Component } from 'react'
import trimCanvas from 'trim-canvas'

import Bezier from './bezier.js'
import Point from './point.js'

export default class SignatureCanvas extends Component {
  static propTypes = {
    velocityFilterWeight: PropTypes.number,
    minWidth: PropTypes.number,
    maxWidth: PropTypes.number,
    dotSize: PropTypes.oneOfType([PropTypes.number, PropTypes.func]),
    penColor: PropTypes.string,
    onEnd: PropTypes.func,
    onBegin: PropTypes.func,
    canvasProps: PropTypes.object
  }

  static defaultProps = {
    velocityFilterWeight: 0.7,
    minWidth: 0.5,
    maxWidth: 2.5,
    dotSize: () => {
      return (this.props.minWidth + this.props.maxWidth) / 2
    },
    penColor: 'black',
    backgroundColor: 'rgba(0,0,0,0)',
    onEnd: () => {},
    onBegin: () => {}
  }

  componentDidMount () {
    this._ctx = this._canvas.getContext("2d");
    //.....

我试图像这样使用它:import * as SignatureCanvas from 'react-signature-canvas'

然而,SignatureCanvas会使用单个属性“default”来评估对象。因此,当我使用时,我得到一个错误,因为SignatureCanvas实际上不是构造函数。

我能够让它工作的唯一方法就是像这样导入它:

declare var require: any;
var SignatureCanvas = require('react-signature-canvas').default;

这似乎不对。哪种导入方式正确?

如果重要的话,我正在使用WebPack2捆绑网站。

2 个答案:

答案 0 :(得分:1)

导入此模块的方法 - 让它作为一个类工作 - 是:

import SignatureCanvas from 'react-signature-canvas';

var x = new SignatureCanvas(...);

import * as xxx from 'xxx'语法与您发现的完全一样:模块xxx的默认导出工件设置为xxx.default。在你的情况下你必须这样做:

import * as SignatureCanvas from 'react-signature-canvas';

var x = new SignatureCanvas.default(...); // now x is the same as above

答案 1 :(得分:0)

您必须导入它,就像模块具有默认导出成员一样:

people.*

默认导出只是一个名为import SignatureCanvas from 'react-signature-canvas' 的命名导出。所以你甚至可以这样做:

default

或者:

import { default as SignatureCanvas } from 'react-signature-canvas'

请参阅有关默认导出的文档:https://www.typescriptlang.org/docs/handbook/modules.html#default-exports