根index.d.ts中的子文件夹的类型

时间:2017-08-21 20:17:22

标签: typescript material-ui definitelytyped

我们为material-ui@next创建了打字,并希望将它们与我们在上一次测试版中使用的库一起发送。

以下是index.d.ts的链接。

但是这些打字不能以现在的形式使用。在开发中,它们在本地使用并且工作正常,但是在使用库TypeScript运送文件时似乎使用了不同的发现策略。

引用子文件夹的所有类型(例如declare 'material-ui/Button/Button')都不会被TypeScript找到。导入组件时,将显示错误:

[ts]
Could not find a declaration file for module 'material-ui/Button/Button'. '<project path>/node_modules/material-ui/Button/Button.js' implicitly has an 'any' type.
  Try `npm install @types/material-ui/Button/Button` if it exists or add a new declaration (.d.ts) file containing `declare module 'material-ui/Button/Button';`

npm_modules文件夹中使用时,TypeScript是否不接受声明其他导入?因为如上所述,在本地使用它们甚至将它们移动到@types/material-ui都会使它们起作用。

此外,TypeScript似乎找到index.d.ts,因为从“root”导入(import { Button} from 'material-ui')。

2 个答案:

答案 0 :(得分:4)

因此,事实证明TypeScript处理node_modules/@types/*node_modules/*内部的输入略有不同:

@types 中的输入称为扩充模块。它们是全球性的,其中的所有内容都将出现在您项目的代码中。这就是访问子模块声明(如material-ui/Button/Button)的原因。

常规npm模块被视为(常规)模块。因此,如果导入子文件夹,则子文件夹必须包含类型。 TypeScript不会转到模块的根目录,并检查那里的类型是否有扩充模块。

这意味着您(a)必须将您的打字发布到DefinitelyTyped或为每个子文件夹和文件创建.d.ts个文件。

您可以在此处找到更长的解释:https://github.com/Microsoft/TypeScript/issues/17945

答案 1 :(得分:0)

我一直在对此进行调查;这很令人困惑。

据我所知,如果在项目中的任何地方都有对文件的引用,则在子模块中具有定义的index.d.ts将起作用,并且其中不包含无模块声明

例如,这有效:

// node_modules/b/index.d.ts
declare module 'b/sub' {
  export function boo(): void;
}

declare module 'b' {
  export function bla(): void;
}

// index.ts
import { boo } from 'b/sub';

boo();

// xedni.ts
import { bla } from 'b';

bla();

但是,删除xedni.ts后,index.ts中的导入将停止工作。

/// <reference types="b" />添加到index.ts或在types: ["b"]中设置tsconfig.json将使其重新工作。

export function bah(): void;添加到index.d.ts中,似乎无法使其正常工作。

我发现这种行为非常不直观...