我继承了一个TypeScript项目,该项目使用了一些JavaScript依赖项,而这些依赖项恰好没有任何@types
包可用。
我设法写了一些模块的类型,但是现在我没有足够的时间来为所有模块做这些类型。
我当前的tsconfig.json
使用严格模式,因此导入无类型模块时出现问题:
> Could not find a declaration file for module 'unfluff'.
> '[...]/node_modules/unfluff/lib/unfluff.js' implicitly has an 'any' type.
闲逛了一会儿,我在TypeScript的Github上找到了这个issue。
然后,我在src/types
目录中创建了一个文件,内容如下:
declare module 'unfluff' {
var _a: any;
export = _a;
}
但是,由于我有多个模块都存在此问题,因此必须为每个模块以及将来我需要的任何其他模块编写一个新的类型文件,这将非常繁琐。
因此,我尝试按照同一问题讨论中的建议创建一个全部捕获模块:
// src/types/fallback.d.ts
declare module '*' {
var _a: any;
export = _a;
}
现在的问题是,在此src/types
文件夹中声明的所有类型都将被忽略。例如,我在该目录中添加了ipfs-http-client
的类型。 之后,我创建了fallback.d.ts
文件,
import ipfs, { IpfsClient } from 'ipfs-http-client';
然后我得到以下错误:
> 2305[QF available]: Module '"*"' has no exported member 'IpfsClient'.
如果我删除了fallback.d.ts
,上面的导入又可以了,但是我陷入了原来的问题。
有没有一种方法可以让真正的 fallback 类型仅用于未类型化的模块?
一个警告是,程序包彼此不相关,因此不能通过模式匹配来解决:
declare module 'some-scope-*' {
var _a: any;
export = _a;
}
如果值钱,这是我的tsconfig.json
:
{
"compilerOptions": {
"composite": true,
"declaration": true,
"declarationMap": true,
"sourceMap": true,
"strict": true,
"target": "es6",
"module": "commonjs",
"allowJs": false,
"checkJs": false,
"esModuleInterop": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"rootDir": "src",
"outDir": "dist",
},
"include": [
"src/**/*.ts"
],
"exclude": [
"node_modules",
"**/*.test.ts"
],
"lib": [
"es6",
"es2015",
"dom"
],
"typeRoots": [
"node_modules/@types",
"./src/types"
]
}