如何在没有定义文件的情况下在 Typescript 中使用 JS 库(React-Summernote)

Posted

技术标签:

【中文标题】如何在没有定义文件的情况下在 Typescript 中使用 JS 库(React-Summernote)【英文标题】:How to use a JS library in Typescript without a Definition file (React-Summernote) 【发布时间】:2017-06-24 07:52:53 【问题描述】:

我想使用 React-Summernote 但它的类型不可用 我尝试执行以下操作

let ReactSummernote1: any = require('react-summernote');
let ReactSummernote = ReactSummernote1.ReactSummernote;

..

 <ReactSummernote
     value=this.props.content
     options=
                   dialogsInBody: true,
                   toolbar: [
                      ['style', ['style']],
                      ['font', ['bold', 'italic', 'underline', 'clear']],
                      ['fontname', ['fontname', 'fontsize', 'color']],
                      ['para', ['ul', 'ol', 'paragraph']],
                      ['insert', ['link', 'picture', 'table', 'hr']],
                      ['view', ['codeview']]
                   ]
                 
   onChange=!this.props.scheduledSession ? this.props.contentUpdated : function ()    />

但这会报错

Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object. 

【问题讨论】:

【参考方案1】:

您可以简单地创建一个自定义类型定义文件 (custom_name.d.ts)

declare module 'react-summernote' 
    var _reactSummernote: any;
    export = _reactSummernote;

然后你可以使用标准语法导入模块

import * as ReactSummernote from 'react-summernote';

更多信息: http://definitelytyped.org/guides/best-practices.html

【讨论】:

***.com/questions/42547859/…【参考方案2】:

查看source code,库react-summernote 会默认导出ReactSummernote

所以使用node require,你应该可以做到

const ReactSummernote = require('react-summernote');

要在 JSX 中使用它,您可能至少需要将其键入为 ReactComponent:

const ReactSummernote = require('react-summernote') as React.ComponentClass<any>;

提出类型定义并将它们贡献给 DefinitiveTyped 将是一个伟大的举措......

【讨论】:

尝试使用反应组件得到相同的错误“元素类型无效:预期字符串(用于内置组件)或类/函数(用于复合组件)但得到:对象。”跨度> 之前从 "xyz" 导入 somthing 解决了同样的问题,但这需要类型定义【参考方案3】:

因此,如果您在查找文件路径时遇到问题。您可以更改服务器配置文件。我正在使用 webpack。这是我的 webpack-config.js 的副本。您可以更改不需要的行。

var path = require('path');
var webpack = require('webpack');
var HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = 
  devtool:"eval",
  entry: [
    'webpack-hot-middleware/client?reload=true',
    './src/index.tsx'
  ],
  output: 
    path: path.join(__dirname, 'dist'),
    filename: 'bundle.js',
    publicPath: '/static'
  ,
  plugins: [
    new webpack.HotModuleReplacementPlugin(),
    new webpack.NoErrorsPlugin()
  ],
  resolve: 
    alias: 
      react: path.resolve('./node_modules/react')
    ,
    extensions:[".js", ".ts", ".tsx","", ".webpack.js", ".web.js"],
    fallback: path.join(__dirname, "node_modules")
  ,
  resolveLoader: 
    root: path.join(__dirname, "node_modules")
  ,
  module: 
    loaders: [
      
        test: /\.tsx?$/,
        loaders: ['react-hot', 'ts'],
        include: path.join(__dirname, 'src')
      ,
      
        test: /\.(scss|css)$/,
        loaders: ["style-loader", "css-loader", "sass-loader"]
      ,
      
        test: /\.(jpg|png|svg)$/,
        loaders: [
            'file-loader?name=[name].[ext]'
        ]
      
    ]
  
;

之后这应该可以工作了。

const ReactSummernote = require('react-summernote');

或者您可以尝试使用./ 导航

注意:确保您重定向到正确的文件夹。

const Name = require ('./../folder/file-name');

【讨论】:

const ReactSummernote = require ('./../folder/file-name');这会给出错误“JSX 元素类型 'ReactSummernote' 没有任何构造或调用签名 如果你想使用它,那么你需要在你的电脑上将folder/file-name 更改为react-summernote 的真实路径 只有 const ReactSummernote = require('../../../node_modules/react-summernote/dist/react-summernote')

以上是关于如何在没有定义文件的情况下在 Typescript 中使用 JS 库(React-Summernote)的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有“dist”的情况下在 NPM 上发布 TypeScript 模块?

如何在没有范围的情况下在 laravel 路由中使用自定义键?

如何在没有循环依赖的情况下在 GraphQL 中拆分模式?

如何在没有地图视图的情况下在自定义图像上显示用户位置

iOS - 如何在没有第三方框架的情况下在 Swift 中创建自定义动画横幅

如何在没有 Jquery-ui 且没有 Bootstrap 的情况下在 angularjs 中创建自定义进度条?