Есть ли способ добавить методы на лету до класса, используя TeampScript?

StackOverflow https://stackoverflow.com//questions/12698893

  •  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'));
.

В основном используйте метод кронштейна Доступ к недвижимости .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top