我正在尝试在转换为Typescript的过程中为我们的Javascript文件添加类型。但是,我无法识别声明文件。
这是我的文件结构
Foo.js
module.exports = function Foo() {
return 'Bar';
};
index.d.ts
export = Foo;
declare function Foo(): string;
index.ts
import Foo = require('./js/Foo')
console.log(Foo());
tsconfig.json
{
"compilerOptions": {
"typeRoots": ["./typings"],
"target": "es5",
"strict": true,
"baseUrl": "./",
"paths": {
"*": ["typings/*"]
}
}
}
package.json
{
"name": "fail",
"version": "1.0.0",
"description": "",
"main": "index.ts",
"scripts": {
"tsc": "tsc"
},
"author": "",
"license": "MIT",
"dependencies": {
"typescript": "^3.1.4"
}
}
这里有仓库来重现我的问题
https://github.com/erisman20/typings_help
编辑:这是我得到的错误
error TS7016: Could not find a declaration file for module './js/Foo.js'. '....../js/Foo.js' implicitly has an 'any' type.
答案 0 :(得分:1)
为诸如'./js/Foo'
之类的相对导入提供声明的唯一方法是将声明文件实际放置在导入路径上(加上.d.ts
或/index.d.ts
)或虚拟地放置它根据您的rootDirs
选项在导入路径中输入。在这种情况下,typeRoots
和baseUrl
/ paths
都不起作用:baseUrl
/ paths
仅影响“非相对”路径的模块分辨率,并且{ {1}}可用于使TypeScript加载文件,但完全不影响导入路径和文件之间的关系。
最简单的解决方案是将typeRoots
文件与Foo.d.ts
放在同一目录中。如果要将输入保留在单独的目录中,则可以将Foo.js
添加到"rootDirs": ["js", "typings"]
。这种更改足以使您的示例对我有用,尽管我发现拥有相应的tsconfig.json
和Foo.js
文件会令人困惑,并且会鼓励您在使用子目录时保持一致,即,要么切换到在JavaScript方面Foo/index.d.ts
,或者在TypeScript方面切换到Foo/index.js
。