在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'.

09-25 16:40