【问题标题】:Importing TypeScript type from another TypeScript package从另一个 TypeScript 包导入 TypeScript 类型
【发布时间】:2016-10-21 16:04:13
【问题描述】:

我已经写了这个并且 npm 发布了这个:https://github.com/justin-calleja/pkg-dependents

现在我正在用 Typescript 编写这个包:https://github.com/justin-calleja/update-dependents

我想在 update-dependents 中重用 pkg-dependents (IndexInfoDict) 中定义的类型,并且我想检查是否有比这更好的方法:

在 pkg-dependents 的 index.ts 中:

import { IndexInfoDict } from './interfaces';

export interface IndexInfoDict extends IndexInfoDict {};

即我正在导入 IndexInfoDict 接口来注释 pkg-dependents 的 index.ts 中的函数,但是因为我想在 update-dependents 中使用相同的类型,所以我不得不导出另一个扩展自身的 IndexInfoDict...

这似乎是一个奇怪的模式,但编译器现在很高兴。


注意:共享类型所采取的额外步骤:

  1. 在 tsconfig.json 中使用 "declaration": true 以便为每个导出内容的 .ts 文件生成一个 .d.ts 文件。
  2. 在 pkg-dependents 的 package.json 中使用 "typings": (path-to-generated-index.d.ts),这样你就可以在你的其他 Typescript 项目中导入 index.js,它会通过 index 知道索引文件的 API .d.ts.
  3. 要实际导入类型并重新使用它:import { IndexInfoDict } from 'pkg-dependents/lib/index.d.ts';

有人可以确认没有更好的方法吗?

我想要,但不知道是否可能,是:

  1. 不必以扩展自身的方式导出 IndexInfoDict(我可以只导出类型……这很有意义)。
  2. 以某种方式避免在导入中使用“pkg-dependents/lib/index.d.ts”。可以是import { pkgDependents, IndexInfoDict } from 'pkg-dependents'吗...但是由于'pkg-dependents'指的是一个JS文件(pkg-dependents的package.json的主要是./lib/index.js),我怀疑这是否可能。

编辑 1:

我想得越多,上面的 2 个(避免'pkg-dependents/lib/index.d.ts')似乎是不可能的。我希望 tsc 有一些魔力来找出从 'index.d.ts' 获取类型定义,即使正在导入 'index.js' - 这样我就可以从 Typescript 项目中 import { pkgDependents, IndexInfoDict } from 'pkg-dependents' 并且只是 @来自 JS 项目的 987654327@(没有 tsc 魔法,而且 JS 也没有类型,所以 IndexInfoDict 已经出局了)。

目前,我必须:

import pkgDependents from 'pkg-dependents';
import { IndexInfoDict } from 'pkg-dependents/lib';

好吧……也许没有魔法。 1呢?除了导出扩展自身的类型之外,还有一种更容易导出导入类型的方法吗?

(我在 pkg-dependents 中不止一个地方使用 IndexInfoDic。其中一个恰好是 index.ts,主要导出函数。因此,我希望它在 index.ts 之外但从 index.ts 导出。 ts 所以它是在 index.d.ts 中生成的,用户从 index.d.ts 中获取 main 函数使用的类型。

【问题讨论】:

  • 我不明白你为什么要重新定义IndexInfoDict?为什么不能在需要的地方直接import { IndexInfoDict } from './interfaces';
  • @MattLishman 你是对的。我的理由是“我希望依赖 pkg 的所有用户都需要在一个地方”。那一个地方不能是 index.js(接口类型不会去那里)。所以 /lib/index.t.ds 是第二好的地方。用户仍然需要 2 个导入 stmts,但至少不需要记住接口目录的路径。我导入 IndexInfoDict 并在 index.ts 中再次导出它,因此它将在 index.d.ts 中生成,并且用户有一个获取主要代码的地方和一个相关的地方来获取主要代码类型(他们只需要知道它在 / lib/index.t.ds)。
  • @MattLishman 正如我继续说的那样,我意识到为了将主要类型保留在 index.t.ds 中,我需要导入/导出 IndexInfoDict 所在的其他类型制作(只留下一个仅供内部使用)。也许这不值得,但我喜欢在项目 pkg-dependents (src/interfaces) 中为所有类型提供一个位置,然后能够选择在 index.t.ds 中导出哪些类型。但也许这没有意义?也许所有类型都应该是“公共的”……

标签: typescript


【解决方案1】:

在你的 index.ts 中,你可以这样做:

export { IndexInfoDict } from "./interfaces;

这将从主文件中导出界面。

【讨论】:

  • 好多了,谢谢!对于任何阅读本文的人来说,我决定将所有类型放在 src/interfaces 中的 pkg-dependents 中(即使是那些不在同一个项目中的文件中使用的类型)。然后在 index.ts 中,我导入/导出(如本答案所示)在 index.js 的导出中使用的类型及其依赖类型(例如 IndexInfoDict 的类型)。
猜你喜欢
  • 2014-09-05
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
  • 2020-08-05
  • 2017-08-07
  • 2020-11-05
  • 1970-01-01
  • 2019-08-11
相关资源
最近更新 更多