【问题标题】:Typescript definition for a module that is a function and has namespaces?作为函数并具有命名空间的模块的打字稿定义?
【发布时间】:2016-06-28 13:07:16
【问题描述】:

我正在尝试为 react-grid-layout 提供一个 *.d.ts 文件。正如其index.js 文件所示,它导出了一个函数——React.Component 的一个子类,称为ReactGridLayout

// react-grid-layout/index.js
module.exports = require('./build/ReactGridLayout').default;
module.exports.utils = require('./build/utils');
// ...

要求:

var ReactGridLayout = require('react-grid-layout');
console.log(ReactGridLayout);
// --> function ReactGridLayout(props , context) { ...

它还将一些其他的东西导出到命名空间中:

for (var f in ReactGridLayout) {
  if (ReactGridLayout.hasOwnProperty(f)) {
    console.log(f);
  }
}
// --> utils
// ...

所以它会进行一次导出多次导出。

我尝试了 Typescript 网站和 this declaration file on GitHub 上描述的 Single Complex Object in Modules 方法,但没有太大成功。

更新

暂时忽略其他内容,我对ReactGridLayout 的定义如下所示:

// react-grid-layout.d.ts
declare module 'react-grid-layout' {

  import * as React from 'react';

  export default class ReactGridLayout<P,S> extends React.Component<P,S> {

    containerHeight():void;

    onWidthChange(width:number):void;

   /* more methods here ... */

}

编译。但是它会生成像这样的 Javascript:

var react_grid_layout_1 = require('react-grid-layout');

React.createElement(react_grid_layout_1.default, null, ...

什么时候应该:

React.createElement(react_grid_layout_1, null, ...    

【问题讨论】:

    标签: javascript reactjs typescript react-grid-layout


    【解决方案1】:

    因为react-grid-layout 是“直接”导出ReactGridLayout 类而不是default,所以你不能做export default(你已经看到了已经发生的事情)。我认为您必须解决 export = 语法,但这似乎限制您只导出一件事。解决这个问题的一种方法是利用 TypeScript 的声明合并。导出具有相同名称的类和命名空间。这或多或少是react-grid-layout 在做什么。

    ma​​in.tsx

    import * as React from 'react'
    import * as ReactGridLayout from 'react-grid-layout'
    
    var grid = new ReactGridLayout(null, null);
    var responsiveGrid = new ReactGridLayout.ResponsiveReactGridLayout(null, null);
    
    <ReactGridLayout></ReactGridLayout>
    //<ReactGridLayout.ResponsiveReactGridLayout></ReactGridLayout.ResponsiveReactGridLayout>
    

    ma​​in.js(转译)

    "use strict";
    var React = require('react');
    var ReactGridLayout = require('react-grid-layout');
    var grid = new ReactGridLayout(null, null);
    var responsiveGrid = new ReactGridLayout.ResponsiveReactGridLayout(null, null);
    React.createElement(ReactGridLayout, null);
    //<ReactGridLayout.ResponsiveReactGridLayout></ReactGridLayout.ResponsiveReactGridLayout>
    

    types.d.ts

    declare module 'react-grid-layout' {
    
        import * as React from 'react';
    
        class ReactGridLayout extends React.Component<ReactGridLayout.Props, ReactGridLayout.State> {
            // members
        }
    
        namespace ReactGridLayout {
            export interface State {
                activeDrag?: any; // declare LayoutItem, etc..
                // etc...
            }
    
            export interface Props {
                className?: string
                // etc...
            }
    
            export class ResponsiveReactGridLayout extends React.Component<any, any>
            {
                // etc
            }
        }
    
        export = ReactGridLayout;
    }
    

    顺便说一句:您可能会发现查看 react-grid-layout 的 ES6 代码更容易。

    【讨论】:

    猜你喜欢
    • 2016-03-08
    • 2017-11-13
    • 2021-02-01
    • 2016-09-04
    • 2016-11-05
    • 2017-01-08
    • 2022-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多