4

我正在用 TypeScript 编写一个库:@cjol/core. 它有一个 JavaScript 依赖项dep,它没有@types可用的包。相反,我编写了一个自定义dep.d.ts文件,它使所有类型在我开发库时都能很好地工作。一切都编译得很好,但dep.d.ts没有出现在输出中的任何地方。

当我尝试将我的库包含在另一个客户端项目@cjol/client中时,客户端项目将无法编译。我收到这样的错误:

../core/build/index.d.ts:2:24 - error TS7016: Could not find a declaration file for module 'dep'. '/home/cjol/.../dep/index.js' implicitly has an 'any' type.
  Try `npm install @types/dep` if it exists or add a new declaration (.d.ts) file containing `declare module 'dep';`

2 > import { Foo } from "dep";

我也在使用 Yarn 工作区(@cjol/core并且@cjol/client都是在同一个工作区中的包,在./core和下./client),但我认为这与这里无关。我需要@cjol/client输出我的自定义定义文件,但我不知道如何实现它!


编辑1:同样,我不确定细节是否相关,但index.d.ts看起来是这样的。如前所述,它是由 TypeScript 生成的。

import { Stuff } from "a-typescript-library";
import { Foo } from "dep";

export * from "./my-app-types";

declare type APIResponse<T> = {
    /* ... */
};
export declare class API {
    /* ... */
}

编辑 2:如下dep.d.ts所示:

declare module "dep" {
  import Something from "something.js";
  export class DepClass {
     /* loads of stuff */
  }
}

编辑4:也许是另一种思考我的问题的方式。如果我编写了自定义.d.ts文件,我该如何分发它?我需要创建一个包含类型定义的全新包吗?

4

2 回答 2

1

不幸的是,打字稿不会将您的自定义*.d.ts文件复制到您的输出中。但是,有几种方法可以解决这个问题。

首先,是在*.d.ts完成运行后手动将自定义文件复制到输出目录中,tsc并确保目录结构与目录中的结构相匹配src

另一种选择是将文件重命名为dep.d.ts文件dep.ts并将其包含在需要该类型的模块中。

现在称为文件dep.ts

declare module "dep" {
  import Something from "something.js";
  export class DepClass {
     /* loads of stuff */
  }
}

导入dep.ts到需要它的模块中。

import './types/dep';
import { Foo } from 'dep';

// Rest of your code here
于 2021-02-11T23:32:44.940 回答
0

好的,我想我知道这里发生了什么,就像我以前遇到的一样。我打赌你没有在项目dep.d.tsbaseUrl定义位置创建你的。在基本根目录中声明的任何模块都将被 TypeScript 自动拾取,其他任何东西都需要映射到tsconfig.json. 此属性称为path- 路径映射。

https://www.typescriptlang.org/docs/handbook/module-resolution.html#path-mapping

例如tsconfig.json,如果您使用正确的映射信息将路径属性添加到此配置文件,它应该可以解决您的问题。

{
  "compilerOptions": {
    "baseUrl": "./",
    "paths": {
      "dep": ["src/typings/dep"] // That location is a example but you need to point that at where your dep.d.ts file is
    }
  }
}
于 2018-07-13T08:38:31.103 回答