无类型npm模块的TypeScript自定义声明文件
我正在使用TypeScript从我的项目中消耗一个名为shiitake的React组件。该库没有TypeScript声明,所以我想我会写一个。声明文件看起来像下面的(也可能是不完整的,但不用担心太多):无类型npm模块的TypeScript自定义声明文件
import * as React from 'react';
declare module 'shiitake' {
export interface ShiitakeProps {
lines: number;
}
export default class Shiitake extends React.Component<ShiitakeProps, any> {
}
}
我已经把这个里面./typings/shiitake.d.ts
文件和VS的代码,我看到下面的错误:
[ts] Invalid module name in augmentation. Module 'shiitake' resolves to an untyped module at 'd:/dev/foo/foobar.foo.Client.Web/node_modules/shiitake/dist/index.js', which cannot be augmented.
在消费方面,我仍然得到同样的错误,即使上述声明(因为我有noImplicitAny
编译器开关打开):
/// <reference path="../../../../typings/shiitake.d.ts" />
import * as React from 'react';
import Shiitake from 'shiitake';
[ts] Could not find a declaration file for module 'shiitake'. 'd:/dev/foo/foobar.foo.Client.Web/node_modules/shiitake/dist/index.js' implicitly has an 'any' type.
标准为什么要获取这种类型的模块的声明文件是通过@types/
way,它运作良好。但是,我无法获得定制打字工作。有什么想法吗?
申报declare module 'shiitake';
应该在全局范围内。即非模块中的*声明(其中模块是具有至少一个*import
或export
的文件)。
模块中declare module '...' { }
表单的声明是扩充,请参阅https://github.com/Microsoft/TypeScript-Handbook/blob/fa9e2be1024014fe923d44b1b69d315e8347e444/pages/Declaration%20Merging.md#module-augmentation以获取更多详细信息。
所以,你要这个文件看起来像:
declare module 'shiitake' {
import * as React from 'react';
export interface ShiitakeProps {
lines: number;
}
export default class Shiitake extends React.Component<ShiitakeProps, any> {
}
}
今天我有同样的问题。
原来我在模块声明之外粘贴导出的接口。 我用作模板的打字文件在文件末尾有专用接口。
所以我的导出接口声明在模块声明之外。 这是驱动器打字稿编译器的坚果。
一旦我将接口移入模块边界,一切都得到了修复。
根据我的经验,如果定义文件在模块定义之外声明了任何导出或导入,则定义文件将以此方式失败。如果您使用自动导入的IDE,请注意!
哇,非常感谢。你是一个节省时间的人 – smac89
这是一个很大的帮助,谢谢。对我来说,问题是'import'语句不在模块之外,而是在内部。 – dbellizzi
我希望我能像这样十次提高这个数字。昨天我花了几个小时。我真的希望TypeScript文档对此更好。 –