9

我正在使用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,它运作良好。但是,我无法获得定制打字工作。有什么想法吗?

回答

26

申报declare module 'shiitake';应该在全局范围内。即非模块中的顶级声明(其中模块是具有至少一个顶级importexport的文件)。

模块中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> { 
    } 
} 
+0

哇,非常感谢。你是一个节省时间的人 – smac89

+3

这是一个很大的帮助,谢谢。对我来说,问题是'import'语句不在模块之外,而是在内部。 – dbellizzi

+0

我希望我能像这样十次提高这个数字。昨天我花了几个小时。我真的希望TypeScript文档对此更好。 –

0

今天我有同样的问题。

原来我在模块声明之外粘贴导出的接口。 我用作模板的打字文件在文件末尾有专用接口。

所以我的导出接口声明在模块声明之外。 这是驱动器打字稿编译器的坚果。

一旦我将接口移入模块边界,一切都得到了修复。

0

根据我的经验,如果定义文件在模块定义之外声明了任何导出或导入,则定义文件将以此方式失败。如果您使用自动导入的IDE,请注意!

相关问题