javascript - 在 Create React App 中为节点模块添加自定义 Typescript 类型声明

标签 javascript reactjs typescript

我正在努力在 Create React App 应用程序中为 react-load-script 添加类型声明。

src 文件夹中,我创建了一个 react-load-script.d.ts 文件并添加了以下内容:

// Type definitions for React Load Script

declare module 'react-load-script' {
  import * as React from 'react'
  interface Script {
    url: string
  }
}

通过上面我得到的错误:

JSX element type 'Script' does not have any construct or call signatures.

我哪里错了?这是模块:https://github.com/blueberryapps/react-load-script

这是我目前在应用程序中的使用情况:

<Script url="https://maps.googleapis.com/maps/api/js?                               key=your_api_key&libraries=places"          
    />

我还需要为 onLoad 添加类型:

<Script url="https://maps.googleapis.com/maps/api/js?                               key=your_api_key&libraries=places"          
      onLoad={this.handleScriptLoad}        
    />

非常感谢。

评论更新

我将声明文件移动并重命名为 /@types/react-load-script/index.d.ts

tsconfig.json 中,我将以下内容添加到 compilerOptions:

"typeRoots": ["./node_modules/@types", "./@types"]

这是index.d.ts的全部内容:

// Type definitions for React Load Script
import React from 'react'

export interface ScriptProps {
  url: string
  onLoad: () => void
  // etc...
}

export default class Script extends React.Component<ScriptProps> {}

有了这个我仍然得到错误:

Could not find a declaration file for module 'react-load-script'. '/Users/sb/git/fl-app/node_modules/react-load-script/lib/index.js' implicitly has an 'any' type.

最佳答案

这是因为 Script 是组件,但是您的界面定义了它的 props

遵循库 sources ,您可能必须这样做:

export interface ScriptProps {
  url: string;
  onLoad: () => void;
  // etc...
}

export default class Script extends React.Component<ScriptProps> {}

评论后编辑

您的类型涉及第三方模块。你必须就此向 Typescript 提出建议。为此,您需要将类型封装在模块声明中,如下所示:

// index.d.ts
declare module 'react-load-script' {
  // imports here...

  export interface ScriptProps {
    url: string;
    onLoad: () => void;
    // etc...
  }

  export default class Script extends React.Component<ScriptProps> {}
}

关于javascript - 在 Create React App 中为节点模块添加自定义 Typescript 类型声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57737169/

相关文章:

javascript - 在加载时以编程方式调用页面顶部的 anchor 标记

javascript - 通过JQuery触发页面加载时的click JS代码

javascript - 从 React 中检查的输入中获取值

javascript - ES6 + React 组件实例方法

javascript - 如何从ReactJS中的单选按钮获取数据?

typescript - Atom typescript tsconfig 和 npm 配置

angular - 如何在 Angular 组件之上声明接口(interface)?

javascript - 在 Angular 6 中使用 JSON 进行过滤

javascript - npm chart.js 最小化后很大

reactjs - 在 Jest 测试文件中使用流会导致未定义的测试、期望等