【问题标题】:How can I declare something in a TypeScript module typing without exporting it?如何在 TypeScript 模块类型中声明某些内容而不导出它?
【发布时间】:2019-01-28 12:35:51
【问题描述】:

我正在为一个包编写分型以贡献给definitelyTyped,所以我正在创建的文件将在模块上下文中解析。这很简单,类似于

import { A } from "package-a";
export function B(): void;

但是,我想声明一些对包的使用者没有用的类型和接口,但使声明更易于阅读和编写:

type ArgType = string | ArrayBuffer | Uint8Array | Readable | ReadableStream;
export function foo(x: ArgType): void;
export function bar(x: ArgType): string;
export function baz(x: ArgType): number;

问题是,一旦我在顶层声明ArgType,它实际上与foobarbaz 一起从模块中导出。这意味着ArgType 出现在自动完成等的语言服务中,看起来很乱。接口和命名空间也会发生这种情况。

dtslint 对此有一个错误,strict-export-declare-modifiers,这就是我第一次发现这种行为的方式。据我所知,在编写实际的 TS 模块(即声明/分型文件)时,这不是问题。难道不能在这个文件中声明消费者看不到的东西吗?

【问题讨论】:

    标签: typescript typescript-typings definitelytyped


    【解决方案1】:

    我知道这样做的唯一方法是使用您的预期导出声明一个命名空间,使用导出分配使该命名空间成为顶级导出,然后将您的辅助定义放在命名空间之外:

    type ArgType = string | ArrayBuffer | Uint8Array | Readable | ReadableStream;
    declare namespace Exports {
        function foo(x: ArgType): void;
        function bar(x: ArgType): string;
        function baz(x: ArgType): number;        
    }
    export = Exports;
    

    我不确定这是否被视为推荐做法(有人知道吗?),您将失去声明默认导出的能力。 IMO,如果您认为类型或接口对编写声明很有用,那么它肯定对某人在某处为库编写包装器有用,所以我将其导出。

    2018 年 9 月 30 日更新

    碰巧的是,Luke Pighetti discovered 一个真正的解决方案:包括至少一个 export {...} 语句,即使是一个空语句,也会抑制导出所有符号的默认行为,即使它们没有标记为 exportAccording to andy-ms,这是受支持的 TypeScript 行为。

    type ArgType = string | ArrayBuffer | Uint8Array | Readable | ReadableStream;
    export function foo(x: ArgType): void;
    export function bar(x: ArgType): string;
    export function baz(x: ArgType): number;
    export {};
    

    【讨论】:

    • 这确实解决了我试图解决的问题——我不想暴露的无用的速记对消费者来说是不可见的。但是,使用 export = SomeNamespace 会触发 dtslint 违规 export-just-namespace。基本上,dtslint 希望您在顶层声明一个模块,而不是将其“隐藏”在命名空间中。我将在他们的追踪器上询问澄清。
    • Question is up,我们会看看dtslint 上是否有人有建议。也许 linter 是错误的!
    猜你喜欢
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 2016-03-12
    • 2020-06-27
    • 2021-06-04
    • 2020-11-29
    相关资源
    最近更新 更多