Есть ли способ добавить методы на лету до класса, используя TeampScript?
-
12-12-2019 - |
Вопрос
Я пытаюсь создать какой-то метод Mixin, который добавляет методы к прототипу / классу на лету, но я получаю ошибки, такие как
Имущество «HENDNAME» не существует по значению типа «Grapher» любой
и
Имущество «HENDNAME» не существует по значению типа «Grapher» любой
Когда я запускаю следующий код.
class Greeter {
greeting: string;
constructor (message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
Greeter.prototype.greetName = function(name){
return this.greet() + ' ' + name;
}
var greeter = new Greeter('Mr');
window.alert(greeter.greetName('Name'));
.
На самом деле он на самом деле компилируется для действительных JS и работает как ожидалось.Есть ли способ сделать это без предупреждений / ошибок компилятора?
Решение
Это решение имеет преимущество вашего типа проверки при динамическом добавлении метода:
class MyClass {
start() {
}
}
var example = new MyClass();
// example.stop(); not allowed
interface MyClass {
stop(): void;
}
MyClass.prototype['stop'] = function () {
alert('Stop');
}
var stage2 = example;
stage2.stop();
. Другие советы
им понадобится концепция частичных классов для этого для работы, которая в настоящее время не поддерживается.Я скажу вам, что то, что я нашел, лучше, работает лучше для этих типов сценариев, состоит в том, чтобы вместо этого использовать интерфейсы (сейчас я программировал в Teamecript примерно через 6 месяцев - я в MS, но не в команде Teamescript) . Интерфейсы
расширяются после того, как этот факт, просто укрепляя методы, которые вы добавляете в интерфейс.В качестве примера этого, если вы устанавливаете плагин jQuery, вы хотите повторно определить интерфейс ijquery & Ijqueryutil, чтобы включить дополнительные методы плагинов.С этого момента вы можете вызвать методы плагинов через $. PLAUGIN () и Teadncript будут счастливы.
Есть другой способ сделать это.
Greeter["SomeProperty"] = function() {
return "somevalue";
};
.
Работает одинаково и использует функцию недвижимости в JavaScript и Teadercript не жалуется.
Аналогично пример @fenton, но без аналогичных материалов:
class MyClass {
start() {
}
}
MyClass.prototype['stop'] = function () {
alert('Stop');
}
interface MyClass {
stop(): void;
}
var example = new MyClass();
example.stop(); // Allowed!!!
. Это как RxJS
делает это
import {Observable} from "./observable"; // which is Greeter in your case
declare module "./observable" {
interface Observable<T> {
map<U>(f: (x: T) => U): Observable<U>;
}
}
Observable.prototype.map = function (f) {
}
.
После необходимости реализовывать динамические методы и свойства на классах, это было решение, которое я смог пойти, чтобы предотвратить жалобу Compler Compiler:
...
window.alert(greeter['greetName']('Name'));
.
В основном используйте метод кронштейна Доступ к недвижимости .