В javascript вы можете сделать это:
function Test() {
this.id = 1;
};
Test.prototype.customize = function(key, callback) {
this[key] = callback;
};
var callback = function() { alert(this.id); };
var x = new Test();
x.customize('testing', callback);
x.testing();
Можете ли вы сделать подобное в typescript?
В частности, меня интересует такой класс:
class Socket {
...
}
class Sockets {
public addChannel(name:string):void {
this[name] = new Socket();
}
...
}
data = new Sockets();
data.addChannel('video');
data.addChannel('audio');
...
var audio = data.audio.read();
var video = data.video.read();
etc.
Компилятор жалуется, что в "Сокетах" нет "аудио" или "видео" и не будет компилироваться. Есть ли способ обойти это без необходимости вручную определять свойства в классе контейнера?
Я знаю, что это некоторые побочные шаги в правилах статического ввода текста, но я считаю, что иногда полезно для удобства API иметь что-то вроде этого.
edit: см. пример ответа, который я разместил ниже; что-то подобное работает. Я по-прежнему соглашусь с любым умным ответом, который позволяет мне каким-то образом скомпилировать что-то полезное для самого базового объекта.