2014-10-10 4 views
2

Функция Register создается путем вызова Register('something'). Typcript говорит, что это возможно только в том случае, если new используется для функции возврата void. В этом случае Register возвращает экземпляр сам по себе. Как я должен набирать это в TypScript?TypeScript - как ввести функцию самообновления

module Register { 

    export function Register(x: string): Instance { 
     if (!(this instanceof Register)) { 
      return new Register(x) 
     } 
     this.value = x 
    } 
    ... 

    export interface Instance { 
     new(x: string): Instance; 
     ... 
    } 

} 
export = Register 
+1

Ответ на этот вопрос вероятно, это: «Вы не должны делать это в TypeScript», но вместо этого вы должны использовать классы и статические методы. – Niko

+0

Надеюсь, что нет. Кажется, это законная конструкция для меня. – donnut

+0

Похожие вопросы: [Как работают типы машинописных подписей с конструкторскими сигнатурами?] (Http://stackoverflow.com/questions/13407036/how-does-typescript-interfaces-with-construct-signatures-work) и [IOC для TypeScript] (http://stackoverflow.com/questions/12795666/ioc-for-typescript) – xmojmr

ответ

2

Может быть, ваш пример упрощен, и вы пытаетесь достичь чего-то более сложного под капотом, но если я понимаю ваш код правильно, вы просто хотите, чтобы вернуть экземпляр функции регистра без нового оператора.

Единственный вариант, о котором я могу думать, это обмануть компилятор TS и указать тип возврата как void, а затем в ваших переменных использовать тип any.

module Register { 

    export function Register(x: string): void { 
     if (!(this instanceof Register)) { 
      return new Register(x); 
     } 
     this.value = x; 
    } 

    export interface Instance { 
     new (x: string): Instance; 
     value: string; 
    } 

} 

export = Register; 

var rega: any = Register.Register("something"); 
console.log(rega.value); // something 

Update: Поскольку у вас есть проблемы с указанием any как явного типа для каждой переменной, то вы можете использовать Object.create() вместо нового оператора:

module Register { 

    export function Register(x: string): Instance { 
     var r = Object.create(Register); 
     r.value = x; 
     return r; 
    } 

    export interface Instance { 
     new (x: string): Instance; 
     value: string; 
    } 

} 

export = Register; 

var rega = Register.Register("something"); 

console.log(rega.value); // something 
+0

Пример упрощен. Эта конструкция позволяет избежать использования ключевого слова 'new' для создания экземпляра, поэтому' Register.Register ('something') 'будет таким же, как' new Register.Register ('something') ' – donnut

+0

Ok cool. Я обновил свой ответ с помощью взлома, который мог бы работать :) –

+0

Спасибо, вот как я использовал его до сих пор, применяя тип 'any'. Это работает, но я надеюсь, что машинописный документ может сделать лучше. Везде, где вы проходите Register, вам нужно указать тип 'any', а не' Register.Instance', который вам не нравится. – donnut

Смежные вопросы