2017-02-07 8 views
7

Следующий код создает функцию фабрики в ES5:функция Factory в машинописном объявляет файл, и без нового ключевого слова

function MyClass(val) { 
    if (!(this instanceof MyClass)) { 
     return new MyClass(val); 
    } 

    this.val = val; 
} 

Эта функция может быть вызвана с или без new ключевого слова:

var a = new MyClass(5); 
var b = MyClass(5); 

Это прекрасно работает в машинописном машинописном документе, однако я не могу понять, как создать декларативный файл с merging, который описывает оба поведения. Есть ли способ сделать это?

+0

Любые конкретные причины, по которым вы хотели бы этого? Я имею в виду, я понимаю, что это работает, но есть причина, почему вы не просто говорите: «Я собираюсь определить, что с этого момента, в TypeScript, это только« новый »объект и определяет его как таковой? Эти статические фабрики в основном сбивают с толку и на самом деле не помогают с какой-либо фактической абстракцией. –

+2

Существует несколько разных аргументов: главное, чтобы забыть «новое» ключевое слово - общий источник ошибок, но все они спорны. Но чтобы более точно ответить на ваш вопрос, это файл объявлений, описывающий существующую библиотеку, для которой удаление заводской подписи является нарушением. Это может измениться в будущем, но теперь это невозможно. На самом деле есть еще один вопрос SO (http://stackoverflow.com/q/32807163/907125), который спрашивает об этом в машинописном тексте, но они предположили, что я его перепрограммирую специально для объявлений. – Andrew

+0

Это справедливо, вчера я дал ему выстрел и не мог этого сделать, так что пингуйте меня через два дня, вы не получите ответа, и я опубликую щедрость на нем :) –

ответ

1
interface MyClass { 
    val: {};  
} 

interface MyClassConstructor { 
    (val: {}): MyClass; 
    new (val: {}): MyClass; 
} 

declare const MyClass: MyClassConstructor;