有没有办法实现TypeScript中重载构造函数的效果,从而使其中一个构造函数实际上是私有的?
对于我用TypeScript编写的类,我想将其中一个构造函数重载设为私有,因为它实际上只供内部使用 我尝试过的代码如下:有没有办法实现TypeScript中重载构造函数的效果,从而使其中一个构造函数实际上是私有的?,typescript,Typescript,对于我用TypeScript编写的类,我想将其中一个构造函数重载设为私有,因为它实际上只供内部使用 我尝试过的代码如下: constructor(data: Array<T>); private constructor(data: Array<T>, options?: SequenceConstructionOptions); constructor(data: Array<T>, options: any) { if (typeof d
constructor(data: Array<T>);
private constructor(data: Array<T>, options?: SequenceConstructionOptions);
constructor(data: Array<T>, options: any) {
if (typeof data === "undefined" || data === null) {
throw "Object construction exception: data cannot be null or undefined.";
}
options = options ?? this.getDefaultConstructionOptions();
this.data = options?.directStore ? data : [...data];
}
let seq = new Sequence<T>(['foo', 'bar', 'baz']);
构造函数(数据:数组);
私有构造函数(数据:数组,选项?:SequenceConstructionOptions);
构造函数(数据:数组,选项:任意){
如果(数据类型==“未定义”| |数据===null){
抛出“对象构造异常:数据不能为null或未定义。”;
}
选项=选项??this.getDefaultConstructionOptions();
this.data=options?.directStore?数据:[……数据];
}
不幸的是,[trans | com]piler对此抱怨,并发出以下信息:
过载签名必须是公共的、私有的或受保护的
显然,混合可见性是不可行的
是否有任何方法可以实现我在上面的示例中尝试做的事情?我愿意接受任何选择,尤其是那些让我跳出框框思考的选择
编辑
已要求提供调用的示例
假设我有一个方法需要返回类本身的新实例。我需要使用专门用于内部使用的构造函数的特殊版本返回实例。例如(为了简洁起见省略了构造函数):
类序列{
获取(计数:编号):序列{
返回新序列(this.data.slice(0,count),SequenceOptions.Store);
}
}
现在,用户通常会创建一个序列
,如下所示:
constructor(data: Array<T>);
private constructor(data: Array<T>, options?: SequenceConstructionOptions);
constructor(data: Array<T>, options: any) {
if (typeof data === "undefined" || data === null) {
throw "Object construction exception: data cannot be null or undefined.";
}
options = options ?? this.getDefaultConstructionOptions();
this.data = options?.directStore ? data : [...data];
}
let seq = new Sequence<T>(['foo', 'bar', 'baz']);
let seq=新序列(['foo','bar','baz']);
但是,他们总是可以使用
SequenceOptions
来调用它,因为无法对他们隐藏SequenceOptions
。Aprivate
构造函数只能在类本身中使用,这似乎有点奇怪。在任何情况下,您可能需要考虑使用工厂方法来代替La<代码>私有创建(数据:数组,选项:序列结构选项):MyClass < /代码>。@ HereticMonkey,奇怪的是,这种行为正是我想要的。但是你怎么调用私有构造函数呢?您需要通过它的构造函数构造一个实例来访问它的私有成员,这是您无法做到的,因为您可以首先访问构造函数。您可以添加一个如何调用私有构造函数的示例吗?@pascalpuetz您可以在作用域中隐藏一个构造函数,并防止它出现在代码的其余部分,但这与将构造函数
签名标记为私有
不同。如果你有一个工厂函数,该函数仍然必须调用一个不能标记为私有的构造函数。你可以有一个隐藏的子类,并将私有构造函数放在该子类上。private
构造函数只能在类本身中使用,这似乎有点奇怪。在任何情况下,您可能需要考虑使用工厂方法来代替La<代码>私有创建(数据:数组,选项:序列结构选项):MyClass < /代码>。@ HereticMonkey,奇怪的是,这种行为正是我想要的。但是你怎么调用私有构造函数呢?您需要通过它的构造函数构造一个实例来访问它的私有成员,这是您无法做到的,因为您可以首先访问构造函数。您可以添加一个如何调用私有构造函数的示例吗?@pascalpuetz您可以在作用域中隐藏一个构造函数,并防止它出现在代码的其余部分,但这与将构造函数
签名标记为私有
不同。如果你有一个工厂函数,该函数仍然必须调用一个不能标记为私有的构造函数。你可以有一个隐藏的子类,并将私有构造函数放在该子类上。