我们为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'
)。
答案 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
中,似乎无法使其正常工作。
我发现这种行为非常不直观...