【问题标题】:Importing node module what exports default class results in a 'module' not a 'constructor'导入节点模块导出默认类的结果是“模块”而不是“构造函数”
【发布时间】:2017-10-30 01:46:14
【问题描述】:

我正在尝试导入节点模块 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 评估为具有单个属性“默认”的对象。所以当我使用时我得到一个错误,因为 SignatureCanvas 实际上不是构造函数。

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

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

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

如果重要的话,我正在使用 WebPack2 来打包网站。

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

      【解决方案2】:

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

      import SignatureCanvas from 'react-signature-canvas'
      

      默认导出只是名称为default 的命名导出。所以你甚至可以这样做:

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

      或者:

      import * as SignatureCanvas from 'react-signature-canvas'
      
      //... and use the `SignatureCanvas` class by accessing the `default property`
      new SignatureCanvas.default()
      

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

      【讨论】:

      • 谢谢。我无法让这个语法在 TypeScript 中编译。我创建了一个客户 .d.ts 文件,我在导入行收到错误,指出没有默认导出。但是我发现将 export = SignatureCanvas 更改为在声明文件中导出默认 SignatureCanvas 与您的答案一起工作。谢谢。 – sheamus 刚刚编辑
      猜你喜欢
      • 2017-05-31
      • 2018-10-30
      • 2020-01-26
      • 1970-01-01
      • 2023-01-25
      • 2019-08-01
      • 2014-11-04
      • 2016-12-01
      • 2017-01-02
      相关资源
      最近更新 更多