gpt4 book ai didi

typescript - 在 typescript 中,如何在不导出类本身的情况下导出私有(private)类的类型

转载 作者:搜寻专家 更新时间:2023-10-30 21:04:28 25 4
gpt4 key购买 nike

我有一个模块,其中公共(public)类的公共(public)方法创建并返回私有(private)类的新实例。要求是 MyClassPrivateHelper 只能由 MyClass 实例化。

class MyClassPrivateHelper {
constructor(private cls: MyClass) {
}

public someHelperMethod(arg): void {
this.cls.someMethod();
}
}
export class MyClass {
public createHelper(): MyClassPrivateHelper { // error here
return new MyClassPrivateHelper(this);
}

public someMethod(): void {
/**/
}
}

有了这种安排,TypeScript 会报告错误:

[ts] 导出类的公共(public)方法的返回类型具有或正在使用私有(private)名称“MyClassPrivateHelper”。

我的目标是只导出私有(private)类的“类型”,而不让使用代码的模块直接实例化它。例如

const mycls = new module.MyClass();

// should be allowed
const helper: MyClassPrivateHelper = mycls.createHelper();

// should not be allowed
const helper = new module.MyClassPrivateHelper();

我试过像这样使用 typeof 但没有成功。

export type Helper = typeof MyClassPrivateHelper

也许我不明白“typeof”是如何工作的。我的问题是:

  • 为什么无法使用 typeof 导出类型?
  • 如何在不暴露模块外部私有(private)类的情况下导出类型?

最佳答案

Why export of type using typeof not working?

export type MyInterface = typeof MyClassPrivateHelper

在此示例中,MyInterface 是构造函数的类型,但您希望导出此构造函数可以生成的实例的类型。

How do I export type without exposing the private class outside module?

像这样:

export type MyInterface = InstanceType<typeof MyClassPrivateHelper>

InstanceType 在这里简要描述:https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html .

或者,我发现以下方法也有效:

type Interface<T> = { [P in keyof T]: T[P] }
export interface MyInterface extends Interface<MyClassPrivateHelper> {}

Interface 类型基本上从 T 复制所有公共(public)属性,然后我们使用它来声明一个新接口(interface)。

参见 https://github.com/Microsoft/TypeScript/issues/471#issuecomment-381842426了解更多详情。

关于typescript - 在 typescript 中,如何在不导出类本身的情况下导出私有(private)类的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49392409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com