2016-04-23 3 views
1

Я хочу создать класс супер классного контейнера, который содержит одно значение.Могу ли я расширить функцию в TypeScript?

let a = new Container(42); 

Я хочу, чтобы получить значение, как этого

a(); // 42 

и установите значения, как этого

a(43); 

Есть ли способ для достижения этой цели в машинописном?

+0

Похоже, какие свойства для. – Stilgar

ответ

2

Перегрузка оператора не поддерживается должным образом в JavaScript/TypeScript. Вы не можете определить функции (кроме конструкторов), которые вызывается, если вы пытаетесь вызвать класс.

+0

Это правда, что нет реальной перегрузки операционной системы, но вы все равно можете сделать некоторые - наверняка ограниченные - вещи, похожие на перегрузку работы [здесь пример] (https://jsfiddle.net/gvo86g6c/). –

2

Есть ли способ достичь этого в TypeScript?

Почему бы и нет. Для этого это можно сделать в простом JavaScript, это легко должно быть достигнуто и в TypeScript. Как всегда всегда с функциями, scope - это ключевое слово для нашего подхода. Конструктор тогда, конечно, неправильно используется как замыкание без создания типов, которые отвечали бы, например, Container через оператора typeof. Такая заводская функция просто вернет другую функцию, которая затем будет использоваться как геттер/сеттер для закрытого начального значения конструктора.

машинопись пример ...

class Container { 

    constructor(storageValue: any) { 
     return (function (value: any) { 

      if (arguments.length !== 0) { 
       storageValue = value; 
      } 
      return storageValue; 
     }); 
    } 
} 

... в простом JavaScript ...

var Container = (function ContainerClass() { 

    var Constructor = (function Container (storageValue) { 
     return (function (value) { 

      if (arguments.length !== 0) { 
       storageValue = value; 
      } 
      return storageValue; 
     }); 
    }); 
    return Constructor; 

}()); 

var a = new Container(24); 

console.log("a() : ", a()); // 24 
console.log("a(4) : ", a(4)); // 4 
console.log("a() : ", a()); // 4 

var b = new Container(72); 

console.log("b() : ", b()); // 72 
console.log("b(5) : ", b(5)); // 5 
console.log("b() : ", b()); // 5 

console.log("a() : ", a()); // 4 
+1

Вместо 'if (UNDEFINED_VALUE! == value) {' лучше использовать 'arguments.length === 0', потому что' a() 'и' a (undefined) 'две разные вещи. –

+0

вы, очевидно, правы. –

+0

Это не безопасный тип. Нет смысла использовать TypeScript, если вы поместите 'any' всюду. – Yaroslav

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