我正在尝试构建一个私有模块,我知道该私有模块将仅由另一个TypeScript项目使用。
根据此(https://github.com/Microsoft/TypeScript/issues/5225),我应该能够简单地导入我的其他项目,而无需构建类型定义。
问题是当我尝试导入该库时,我缺少该库的任何依赖项的类型定义。
这里是情况:
假设您有两个项目。 lib
和app
。 app
导入lib
,这是一个纯TypeScript节点模块。
├── app/ │ ├── dist/ │ │ ├── index.d.ts │ │ ├── index.js │ │ └── index.js.map │ ├── src/ │ │ └── index.ts │ ├── package.json │ ├── package-lock.json │ └── tsconfig.json └── lib/ ├── src/ │ └── index.ts ├── package.json ├── package-lock.json └── tsconfig.json
app
只需从lib
导入一个函数并运行它:
import lib from "lib";
lib("test");
Lib导入依赖项及其类型,并导出函数:
package.json
:
"dependencies": {
"dotenv": "^6.1.0"
},
"devDependencies": {
"@types/dotenv": "^4.0.3",
"typescript": "^3.1.6"
}
app/src/index.ts
:
import dotenv from "dotenv";
dotenv.load()
export default (message: string) => {
console.log(message);
}
当我尝试构建app
时,从lib
依赖项中收到有关缺少的类型定义的错误:
node_modules/lib/src/index.ts:1:20 - error TS7016: Could not find a declaration file for module 'dotenv'. 'lib/node_modules/dotenv/lib/main.js' implicitly has an 'any' type. Try `npm install @types/dotenv` if it exists or add a new declaration (.d.ts) file containing `declare module 'dotenv';` 1 import dotenv from "dotenv";
处理这种情况的正确方法是什么?它可以在JS / TS混合模块中正常工作,因为“编译边界”将在导入的模块及其公开的类型结束,但是由于此模块是“纯” TypeScript,因此它将像抓取所有其依赖项一样那是一个大型仓库。
进行此设置的正确方法是什么?还是真正的问题是npm install
不安装dev依赖项?我应该安装所有@types
作为产品依赖吗?
答案 0 :(得分:1)
据此:https://www.typescriptlang.org/docs/handbook/declaration-files/publishing.html
建议将所有依赖项安装为prod依赖项:
我们的软件包公开了每个声明中的声明,因此 我们的browserify-typescript-extension套件需要具有这些 依赖关系。因此,我们使用“依赖项”而不是 “ devDependencies”,因为否则我们的消费者将需要 手动安装这些软件包。如果我们刚刚写了一条命令 行应用程序,并且不希望我们的软件包用作库, 我们可能已经使用过devDependencies。
因此,基本上,如果要编写Typescript npm模块,则所有依赖项都必须是prod依赖项。
答案 1 :(得分:0)
是的,在我最后一次构建打字稿npm模块的经验中,我必须在@type/<package>
中将键入dependencies
作为package.json
的第三方软件包。
我的上一个npm模块是使用ioredis构建的。所以我的模块package.json
如下所示:
{
"name": "my-redis",
"version": "1.0.0",
"dependencies": {
"ioredis": "^4.2.0",
"@types/ioredis": "^4.0.3"
},
}
这样做,如果模块安装在其他系统中,它将自动检测到打字,否则该系统必须手动安装打字包。