В 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();
Можете ли вы сделать подобную вещь в машинописи?
Особенно я заинтересован в том, класс, как:
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 иметь что-то вроде этого.
Редактировать: см. Пример ответа, который я разместил ниже; что-то подобное работает. Я по-прежнему соглашусь с любым умным ответом, который позволяет мне каким-то образом скомпилировать что-то полезное для самого базового объекта.
Это принципиально невозможно статически проверить. (см. проблему остановки) – SLaks
Я знаю, но разве я не могу что-то использовать в словаре? Как и общедоступные каналы: {[name: string]: Socket} = {} ... data.channels.audio.read() ;. Всегда ли тип машинописного текста требует, чтобы свойства класса и свойства словаря считывались с помощью [] скобок? – Doug
Вы всегда можете написать javascript, если TS не поддерживает его. –