将类构造器重载复制至静态方法Span.make的实现方案
为带重载构造函数的类实现静态工厂方法
现有一个带有两个构造器重载的Span类:
export class Span { start: Time end: Time constructor (span: TimeConstructable, end?: TimeConstructable) constructor (span: { start: TimeConstructable, end: TimeConstructable }) constructor (span: { start: TimeConstructable, end: TimeConstructable } | TimeConstructable, end?: TimeConstructable) { if (typeof span === 'object' && ('start' in span) && ('end' in span)) { this.start = Time.m(span.start) this.end = Time.m(span.end) } else { if (!end) throw new Error('missing end in span') this.start = Time.m(span) this.end = Time.m(end) } } }
需要添加一个静态方法Span.make,要求:
- 接收与构造函数完全相同的参数
- 内部仅通过调用
new Span(...)创建实例,不重复构造函数内的逻辑
以下是符合要求的实现:
export class Span { start: Time end: Time constructor (span: TimeConstructable, end?: TimeConstructable) constructor (span: { start: TimeConstructable, end: TimeConstructable }) constructor (span: { start: TimeConstructable, end: TimeConstructable } | TimeConstructable, end?: TimeConstructable) { if (typeof span === 'object' && ('start' in span) && ('end' in span)) { this.start = Time.m(span.start) this.end = Time.m(span.end) } else { if (!end) throw new Error('missing end in span') this.start = Time.m(span) this.end = Time.m(end) } } static make (span: TimeConstructable, end?: TimeConstructable) static make (span: { start: TimeConstructable, end: TimeConstructable }) static make (span: { start: TimeConstructable, end: TimeConstructable } | TimeConstructable, end?: TimeConstructable) { return new Span(span, end) } }
内容的提问来源于stack exchange,提问作者ThomasReggi
相关产品推荐
相关产品推荐

