在typescript项目中,我需要使用bytewisenpm模块。此包在definitelytyped npm命名空间中没有类型定义,因此我无法使用typescript文档中描述的方法:
npm install --save-dev @types/bytewise
因为这个模块没有类型声明,所以不可能使用它,因为
tsc
抱怨:error TS2307: Cannot find module 'bytewise'
。为了解决这个问题,我为
bytewise
编写了一个声明文件,并将其添加到node_modules/@types/bytewise/index.d.ts
中,这非常有效。但是,这是一个乏味的常见模式:我使用一个小的npm库,它没有@types声明,在
node_modules/@types
下创建一个目录,添加一个包含库声明的index.d.ts
,然后git force/add该文件(因为默认情况下忽略了node_modules
)。显然,我不打算将这些声明永远保存在我的私有
node_modules
目录下,最终我希望将它们贡献回definitelytyped,以便以后更容易地安装它们,但与其为我使用的每个库创建单独的目录/文件,我宁愿在项目根目录中有一个vendor.d.ts
文件,其中包含所有声明在NPM上不可用。像这样的东西(这是我在我的ATM项目中所拥有的):import bl = require("bl");
import {Stream} from "stream";
declare module "bytewise" {
export function encode(val: any): bl;
export function decode(val: bl): any;
export const buffer: boolean;
export const type: string;
}
declare module "JSONStream" {
export function parse(patternOrPath?: string): Stream;
export function stringify(open?: string, sep?: string, close?: string);
}
问题是:如何使这些声明对项目中的所有文件都可用?我试图修改
tsconfig.json
以将其包含在入口点之前:{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"noImplicitAny": false,
"removeComments": true,
"preserveConstEnums": true,
"outDir": "out",
"sourceMap": true
},
"files": [
"vendor.d.ts",
"index.ts"
]
}
但在我有
error TS2307: Cannot find module 'bytewise'.
的文件中仍然可以找到import * as bytewise from "bytewise";
。我还尝试添加指向/// <reference path="..." />
的vendor.d.ts
注释,但得到了相同的错误。我真的需要为每个npm模块有一个单独的声明文件吗?还是我遗漏了什么? 最佳答案
只需在项目中包含vendor.d.ts
,无需特殊配置,但只需一个关键更改:将顶部的两个导入移到行之后
declare module "bytewise" {
声明之外的任何出口或进口都会导致这种失败,其中隐含的信息如下:
Error:(3, 16) TS2665:Invalid module name in augmentation. Module 'bytewise' resolves to an untyped module at 'my-project/node_modules/bytewise/bytewise.js'.