【问题标题】:TypeScript - export library with 'namespaces'TypeScript - 带有“命名空间”的导出库
【发布时间】:2018-10-27 08:46:04
【问题描述】:

好的,例如我有一个文件结构如下的项目:

让项目命名为'my-module'

我想将此库导入到其他类似的项目中:

import { User, Home } from 'my-module/Models'
import { BaseWindow } from 'my-module/View'

我该怎么做?如何准备.d.ts文件?

编辑:

Project

以上文件内容很简单,例如:

interface IUser {
  name: string;
  age: number;
}

type UserOptions = IUser & {
  foo: string
}

class User implements IUser {
  private foo: string;
  name: string;
  age: number;
  constructor(options: UserOptions) {
    this.name = options.name;
    this.age = options.age;
    this.foo = options.foo;
  }
}

export { User, UserOptions };

【问题讨论】:

  • 如果这些导入具有运行时内容(例如,一个类而不仅仅是一个接口),您将需要一个 .ts 文件,而不仅仅是一个 .d.ts 文件。它的位置需要与您要使用的导入路径相匹配。即,您将创建 src/Models/index.tssrc/View/index.ts 文件,这些文件从图片中显示的源文件中导入必要的项目,并将它们重新导出为命名导出。如果您将现有源文件的导出添加到问题中,我可以为您提供包装器 .ts 文件的内容。
  • @MattMcCutchen 我会很感激给你一个例子。

标签: typescript module


【解决方案1】:

我猜你想要src/Models/index.ts 是:

export * from "./User";
export * from "./Home";

然后,假设您已正确设置模块分辨率,您可以编写:

import { User, UserOptions } from "my-module/Models";

UserUserOptions 将分别引用来自src/Models/User.ts 的类和类型别名。如果src/Models/User.tssrc/Models/Home.ts 声明一个同名符号,我相信第一个export * 语句获胜。

模块解析问题

如果my-module/ 的导入为您提供了srcdist 的完成,那么您需要导入.js.d.ts 文件的完整相对路径(应该在每个文件旁边)其他)。我假设这些文件在dist 下。如果您不喜欢导入路径中的 dist,您有几个选择,但都不是很好:

  1. 不要使用srcdist目录;从项目的根目录开始排列所有文件。
  2. 使用您可以自定义的模块绑定器或加载器,以便import "my-module/Models"dist 文件夹中查找。如果您的捆绑器或加载器尚未与 TypeScript 集成,请使用 TypeScript 的 path mapping 选项使 TypeScript 的模块解析行为反映您的捆绑器或加载器的行为。
  3. 通过手动创建一对导入真实路径的.js.d.ts文件或带有maintypespackage.json文件,将每个导入路径分别重定向到dist下的正确文件引用真实路径的字段。

【讨论】:

  • 我想我的模块解析有问题(这对我来说是新话题),因为在其他项目中,当我输入 my-module/ 时,我看到文件夹 dist、node_modules 和 src。我也不知道我应该在src/index.ts 中输入什么。 import './Models够了吗?
  • 我更新了讨论模块解析的答案。您不必在 src/index.ts 中添加任何内容,除非您想从中导入,在这种情况下,您放在那里的内容取决于您要如何编写导入。
猜你喜欢
  • 1970-01-01
  • 2016-09-30
  • 2018-01-05
  • 1970-01-01
  • 2018-12-13
  • 2018-05-21
  • 2021-02-26
  • 1970-01-01
  • 2010-10-29
相关资源
最近更新 更多