我阅读了TypeScript模块解析的工作原理。
我有以下存储库:@tsstack/di。编译后,目录结构如下:
├── dist
│ ├── annotations.d.ts
│ ├── annotations.js
│ ├── index.d.ts
│ ├── index.js
│ ├── injector.d.ts
│ ├── injector.js
│ ├── profiler.d.ts
│ ├── profiler.js
│ ├── providers.d.ts
│ ├── providers.js
│ ├── util.d.ts
│ └── util.js
├── LICENSE
├── package.json
├── README.md
├── src
│ ├── annotations.ts
│ ├── index.ts
│ ├── injector.ts
│ ├── profiler.ts
│ ├── providers.ts
│ └── util.ts
└── tsconfig.json
在package.json中,我写了“main”:“dist/index.js”。
在Node.js中,一切正常,但TypeScript:
import {Injector} from '@ts-stack/di';
找不到模块“@ts stack/di”的声明文件/path/to/node_modules/@tsstack/di/dist/index.js”隐式具有“any”类型。
然而,如果我按如下方式导入,那么一切都正常:
import {Injector} from '/path/to/node_modules/@ts-stack/di/dist/index.js';
我做错了什么?
这就是我工作的方式。
在我的例子中,我使用了一个没有定义类型的库:react mobile datepicker
a.在/src中创建文件夹。在我的例子中,我使用了以下路径:/src/typengs/。
b.创建.dts文件。例如:/src/typerings/react-mobile-datepicker.dts
c.我使用以下代码扩展其财产并使其类型安全:
declare module 'react-mobile-datepicker' {
class DatePicker extends React.Component<DatePickerProps, any> {}
interface DatePickerProps {
isPopup?: boolean;
theme?: string;
dateConfig?: DatePickerConfig;
}
export interface DatePickerConfig {
prop1: number;
pro2: string;
}
export default DatePicker;
}
d.按照通常使用第三方库的方式导入类型。
import DatePicker, { DatePickerConfig, DatePickerConfigDate } from 'react-mobile-datepicker';
e.更改tsconfig.json并添加以下代码:
{
"compilerOptions": {
//...other properties
"typeRoots": [
"src/typings",
"node_modules/@types"
]
}}
链接到我用作来源的文章:
https://templecoding.com/blog/2016/03/31/creating-typescript-typings-for-existing-react-components
https://www.credera.com/insights/typescript-adding-custom-type-definitions-for-existing-libraries
在我看来,解决这个问题的三种不同方法都不起作用。一旦在package.json中将“type”设置为“module”,那么它将符合ES module而不是CommonJS语法。我能够根据package.json设置使用ES模块语法来解决这个问题。
import ws from 'ws'
export const create = (/** @type {string} */ accessToken) => {
const WebSocket = ws;
return new WebSocket(endpoint, accessToken, sslOptions);
}
这样,您就可以在“ws”模块中使用WebSocket类。这是一个节点模块的示例,但基本上可以将任何类型的节点模块和函数放在其中。
下面这些对我不起作用:
npm安装-D@types/module名称const foo=require('模块名称');
// index.d.ts
declare module 'foo';
tsconfig.json中的配置
"noImplicitAny": true,
"allowJs": true
如果导入不适用于您
import * as html2pdf from 'html2pdf.js';
注释代码,将以下脚本文件保存在index.html中,如官方文档中所示。
<script src="https://rawgit.com/eKoopmans/html2pdf/master/dist/html2pdf.bundle.min.js"></script>
并在正在使用的组件中声明html2pdf变量。
declare var html2pdf: any;
就是这样。我在这个问题上纠结了两天,但最终得到了解决。