在TypeScript项目中,从一个文件中导出所有接口/类型

15

我的库的直接接口被捕获为

index.d.ts

目前是自动生成的

index.ts

在我的项目的 package.json 文件中,typings/types 属性指向这个 index.d.ts 文件,据我理解,这是正确的方式。到目前为止一切顺利。

但是,有一些类型我希望从 index.d.ts 中导出,但目前并未在 index.d.ts 中表达。

例如,我手动创建了一些类型

foo.d.ts
bar.d.ts

我希望这些内容在index.d.ts中表达出来。

我认为可能的唯一方法是将foo.d.ts / bar.d.ts类型导入index.d.ts,然后再从该文件中导出它们。

但是,我遇到了问题!

以下是我的尝试:

// index.ts

import {IBar} from '../bar.d.ts'
import {IFoo} from '../foo.d.ts'

// ... do some stuff with index.ts yadda yadda

export type IBar = IBar; // doesn't seem to work
export interface IFoo = IFoo; // doesn't seem to work

这是可能的吗?我该怎么做?
4个回答

32

如果您不需要使用它们,您可以直接导出它们。

export * from '../foo/bar';

或者,如果您只需要导出其中的一些内容,则可以使用。

export { IFoo, IBar} from '../foo/bar';

或者,如果您想在导出时将它们重命名,可以这样做:

export { IFoo as IOther, IBar as Dogs } from '../foo/bar';
你可以在MDN文档这里了解更多相关信息。

1
这对我来说不起作用,最终原因是使用了默认类型。例如,如果 IFoo 被定义为 export default class IFoo { ..... },那么你的 index.ts 需要执行 export {default as IFoo} from '../foo/bar'; - Kip

4

我认为其他答案都可以解决问题。如果您确实需要在文件中使用IFoo和IBar,则需要执行以下操作:

import * as IFooImport from '../foo.d.ts';

// use IFooImport

export import IFoo = IFooImport.IFoo;

这个可以工作,但使用 "export import" 语法有点笨拙。


谢谢你的提示!为了导出所有内容,我使用了 export import myThings = myThings; - Eliseu Monar dos Santos

3
你可以尝试以下方法:
export {IBar} from '../bar.d.ts'
export {IFoo} from '../foo.d.ts'

0

为了让这个工作变得更容易,我发现你可以按照aws-cdk的示例进行操作;

需要检查的事项包括:

  1. 在模块文件之间使用相对路径进行内部导入(例如,从'./subdir1/file1'导入{a})=> 这样,在转译后,转译文件引用仍然有效
  2. 在index.ts中,您需要每个文件有一行“export *”; 可以使用find + sed生成
    // find . -type f -exec echo {} \;  | sed 
    //     's/\(.*\)\.ts/export \* from \"\1\"/'  
    export * from "./subdir1/file1"
    export * from "./subdir1/file2"
    export * from "./subdir2/file1"

此示例显示如何设置package.json; 查看attrs main、module、types、files、build:esm、build:types https://github.com/tomchen/example-typescript-package/blob/main/package.json

然后,在目标代码中,您可以执行以下操作:

    import * as somenamespace from "@somepublisher/somemodule";
    import { SomeOtherClass } from "@somepublisher/somemodule";
    const x = new somenamespace.SomeClass();
    const y = new SomeOtherClass();


这段代码是关于编程的,它导入了一个名为“@somepublisher/somemodule”的模块,并使用“*”将其所有内容都导入到“somenamespace”命名空间中。此外,它还从该模块中导入了“SomeOtherClass”类。最后,它创建了两个变量“x”和“y”,分别实例化了“somenamespace.SomeClass”和“SomeOtherClass”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接