TypeScript - 从 DefinitelyTyped 导入一些使用声明文件(类型)的 npm 包时出现问题
TypeScript - Problems importing some npm packages that use declaration files (typings) from DefinitelyTyped
对于我正在导入的一些模块,我最终修改了它们的声明文件以使它们工作。我不确定我是不是做错了,或者这些模块的类型是否恰好有问题。
index.tsx
import * as React from "react";
import * as moment from "moment";
import BigCalendar from "react-big-calendar";
import ReactModal from "react-modal";
react
和 moment
导入正常。问题在于 react-big-calendar
和 react-modal
。这基本上是我为 react-modal
:
经历的过程
我安装了@types/react-modal
.
node_modules/@types/react-modal/index.d.ts(缩写)
// Type definitions for react-modal 1.6
// Project: https://github.com/reactjs/react-modal
// Definitions by: Rajab Shakirov <https://github.com/radziksh>, Drew Noakes <https://github.com/drewnoakes>, Thomas B Homburg <https://github.com/homburg>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
// TypeScript Version: 2.3
import * as React from "react";
export as namespace ReactModal;
export = ReactModal;
declare namespace ReactModal {
interface Props {
...
}
}
declare class ReactModal extends React.Component<ReactModal.Props> {
...
}
我试过 import ReactModal from "react-modal"
结果是 Module '...' has no default export
.
我试过了import { ReactModal } from "react-modal"
这给了我 Module '...' has no exported member 'ReactModal'
.
我试过 import * asReactModal from "react-modal"
编译,但在 运行 时给了我 Warning: React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: object
。
最后我只是将声明文件更改为:
import * as React from "react";
export as namespace ReactModal;
declare namespace ReactModal {
interface Props {
...
}
}
export default class ReactModal extends React.Component<ReactModal.Props> {
...
}
然后我就可以使用 import ReactModal from "react-modal"
,而且成功了。
使用 react-big-calendar
我刚刚卸载了 @types/react-big-calendar
,现在有了自己的输入法。当然,其他人正在为这些包使用这些声明文件而没有这些麻烦。任何指导将不胜感激。
package.json
{
"dependencies": {
"@types/react": "^15.0.27",
"@types/react-dom": "^15.5.0",
"@types/react-modal": "^1.6.7",
"moment": "^2.18.1",
"react": "^15.5.4",
"react-big-calendar": "^0.14.0",
"react-dom": "^15.5.4",
"react-modal": "^2.1.0"
},
"devDependencies": {
"awesome-typescript-loader": "^3.1.3",
"babel-core": "^6.24.1",
"babel-loader": "^7.0.0",
"babel-preset-es2015": "^6.24.1",
"babel-preset-react": "^6.24.1",
"css-loader": "^0.28.4",
"source-map-loader": "^0.2.1",
"style-loader": "^0.18.2",
"typescript": "^2.3.4",
"webpack": "^2.5.0"
}
}
tsconfig.json
{
"compilerOptions": {
"outDir": "./Scripts/dist/",
"sourceMap": true,
"noImplicitAny": true,
"target": "es5",
"jsx": "react"
},
"include": [
"./Scripts/src/**/*"
],
"exclude": [
"node_modules"
]
}
我认为 react-modal/index.d.ts has a bug and you (or I) should submit a pull request. If I interpret their react-modal-tests.tsx 正确,他们使用 import * as ReactModal from 'react-modal';
导入它,编译但不 运行。我的印象是他们的测试只能编译。
我在 node_packages/@types 中找到了如何在不修改文件的情况下让它工作的方法。
将这些行添加到 tsconfig 文件的 compilerOptions
部分:
"baseUrl": "src/types",
"typeRoots": [ "./src/types", "./node_modules/@types" ]
然后将修改后的react-modal/index.d.ts
放入src/types/react-modal/index.d.ts
。然后打字稿编译器应该在那里找到它。我只是将 node_modules/@types/react-modal
的内容复制到 src/types/react-modal
并进行了更改。
对于我正在导入的一些模块,我最终修改了它们的声明文件以使它们工作。我不确定我是不是做错了,或者这些模块的类型是否恰好有问题。
index.tsx
import * as React from "react";
import * as moment from "moment";
import BigCalendar from "react-big-calendar";
import ReactModal from "react-modal";
react
和 moment
导入正常。问题在于 react-big-calendar
和 react-modal
。这基本上是我为 react-modal
:
我安装了@types/react-modal
.
node_modules/@types/react-modal/index.d.ts(缩写)
// Type definitions for react-modal 1.6
// Project: https://github.com/reactjs/react-modal
// Definitions by: Rajab Shakirov <https://github.com/radziksh>, Drew Noakes <https://github.com/drewnoakes>, Thomas B Homburg <https://github.com/homburg>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
// TypeScript Version: 2.3
import * as React from "react";
export as namespace ReactModal;
export = ReactModal;
declare namespace ReactModal {
interface Props {
...
}
}
declare class ReactModal extends React.Component<ReactModal.Props> {
...
}
我试过 import ReactModal from "react-modal"
结果是 Module '...' has no default export
.
我试过了import { ReactModal } from "react-modal"
这给了我 Module '...' has no exported member 'ReactModal'
.
我试过 import * asReactModal from "react-modal"
编译,但在 运行 时给了我 Warning: React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: object
。
最后我只是将声明文件更改为:
import * as React from "react";
export as namespace ReactModal;
declare namespace ReactModal {
interface Props {
...
}
}
export default class ReactModal extends React.Component<ReactModal.Props> {
...
}
然后我就可以使用 import ReactModal from "react-modal"
,而且成功了。
使用 react-big-calendar
我刚刚卸载了 @types/react-big-calendar
,现在有了自己的输入法。当然,其他人正在为这些包使用这些声明文件而没有这些麻烦。任何指导将不胜感激。
package.json
{
"dependencies": {
"@types/react": "^15.0.27",
"@types/react-dom": "^15.5.0",
"@types/react-modal": "^1.6.7",
"moment": "^2.18.1",
"react": "^15.5.4",
"react-big-calendar": "^0.14.0",
"react-dom": "^15.5.4",
"react-modal": "^2.1.0"
},
"devDependencies": {
"awesome-typescript-loader": "^3.1.3",
"babel-core": "^6.24.1",
"babel-loader": "^7.0.0",
"babel-preset-es2015": "^6.24.1",
"babel-preset-react": "^6.24.1",
"css-loader": "^0.28.4",
"source-map-loader": "^0.2.1",
"style-loader": "^0.18.2",
"typescript": "^2.3.4",
"webpack": "^2.5.0"
}
}
tsconfig.json
{
"compilerOptions": {
"outDir": "./Scripts/dist/",
"sourceMap": true,
"noImplicitAny": true,
"target": "es5",
"jsx": "react"
},
"include": [
"./Scripts/src/**/*"
],
"exclude": [
"node_modules"
]
}
我认为 react-modal/index.d.ts has a bug and you (or I) should submit a pull request. If I interpret their react-modal-tests.tsx 正确,他们使用 import * as ReactModal from 'react-modal';
导入它,编译但不 运行。我的印象是他们的测试只能编译。
我在 node_packages/@types 中找到了如何在不修改文件的情况下让它工作的方法。
将这些行添加到 tsconfig 文件的 compilerOptions
部分:
"baseUrl": "src/types",
"typeRoots": [ "./src/types", "./node_modules/@types" ]
然后将修改后的react-modal/index.d.ts
放入src/types/react-modal/index.d.ts
。然后打字稿编译器应该在那里找到它。我只是将 node_modules/@types/react-modal
的内容复制到 src/types/react-modal
并进行了更改。