Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法实现TypeScript中重载构造函数的效果,从而使其中一个构造函数实际上是私有的?_Typescript - Fatal编程技术网

有没有办法实现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

对于我用TypeScript编写的类,我想将其中一个构造函数重载设为私有,因为它实际上只供内部使用

我尝试过的代码如下:

  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

A
private
构造函数只能在类本身中使用,这似乎有点奇怪。在任何情况下,您可能需要考虑使用工厂方法来代替La<代码>私有创建(数据:数组,选项:序列结构选项):MyClass < /代码>。@ HereticMonkey,奇怪的是,这种行为正是我想要的。但是你怎么调用私有构造函数呢?您需要通过它的构造函数构造一个实例来访问它的私有成员,这是您无法做到的,因为您可以首先访问构造函数。您可以添加一个如何调用私有构造函数的示例吗?@pascalpuetz您可以在作用域中隐藏一个构造函数,并防止它出现在代码的其余部分,但这与将
构造函数
签名标记为
私有
不同。如果你有一个工厂函数,该函数仍然必须调用一个不能标记为私有的构造函数。你可以有一个隐藏的子类,并将私有构造函数放在该子类上。
private
构造函数只能在类本身中使用,这似乎有点奇怪。在任何情况下,您可能需要考虑使用工厂方法来代替La<代码>私有创建(数据:数组,选项:序列结构选项):MyClass < /代码>。@ HereticMonkey,奇怪的是,这种行为正是我想要的。但是你怎么调用私有构造函数呢?您需要通过它的构造函数构造一个实例来访问它的私有成员,这是您无法做到的,因为您可以首先访问构造函数。您可以添加一个如何调用私有构造函数的示例吗?@pascalpuetz您可以在作用域中隐藏一个构造函数,并防止它出现在代码的其余部分,但这与将
构造函数
签名标记为
私有
不同。如果你有一个工厂函数,该函数仍然必须调用一个不能标记为私有的构造函数。你可以有一个隐藏的子类,并将私有构造函数放在该子类上。