typescript kullanarak bir sınıfa anında yöntemleri eklemek için bir yol var mı?

oy
17

Ben anında prototip / sınıfa yöntemleri eklemek mixin yöntemin çeşit oluşturmak çalışıyorum ama Hataları gibi olsun

mülkiyet 'greetName' türündeki değeri 'Greeter' herhangi biri yok

ve

mülkiyet 'greetName' türündeki değeri 'Greeter' herhangi biri yok

Aşağıdaki kodu çalıştırdığınızda.

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

Beklendiği gibi Aslında geçerli js çalışmasına devam eder derler. dışarı derleyici uyarı / hata ile bunu yapmanın bir yolu var mı?

Oluştur 02/10/2012 saat 22:49
kaynak kullanıcı
Diğer dillerde...                            


6 cevaplar

oy
15

Bu çözüm, dinamik bir yöntem eklediğinizde tip kontrolü veren yararı vardır:

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();
Cevap 06/06/2013 saat 17:02
kaynak kullanıcı

oy
8

bunu yapmanın başka bir yolu yoktur.

Greeter["SomeProperty"] = function() {
     return "somevalue";
};

Aynı Çalışır ve javascript mülkiyet dizin fonksiyonunu kullanır ve typescript şikayet etmiyor.

Cevap 19/12/2012 saat 16:06
kaynak kullanıcı

oy
8

Onlar şu anda desteklenmemektedir işe bunun için kısmi sınıfların bir kavram gerekir. Ne buldum bu tür senaryolardan için daha iyi çalıştığını anlatacağım yerine arayüzleri kullanmaktır (şimdi yaklaşık 6 aydır ben daktilo programlama oldum - Ben MS de değilim ama typescript takımında)

Arayüzler basitçe arayüzüne eklediğiniz yöntemler definging tarafından olaydan sonra genişletilebilir vardır. Eğer bir jQuery eklentisi yüklerseniz bu bir örnek olarak, eklentileri ek yöntemlerin dahil etmek IJQuery & IJQueryUtil arayüzünü yeniden tanımlamak istersiniz. Bu noktadan itibaren ileriye mutlu olacaksın $ .plugin () ve typescript aracılığıyla eklentileri yöntemlerini çağırabilirsiniz.

Cevap 02/10/2012 saat 23:22
kaynak kullanıcı

oy
1

ama gnarly malzeme olmadan, örnek @Fenton benzer:

class MyClass {
    start() {
    }
}
MyClass.prototype['stop'] = function () {
    alert('Stop');
}

interface MyClass {
    stop(): void;
}

var example = new MyClass();
example.stop(); // Allowed!!!
Cevap 26/05/2018 saat 14:16
kaynak kullanıcı

oy
0

Bu nasıl RxJSyapar

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) {

}

Bu Modül Büyütme denir.

Cevap 23/10/2018 saat 00:21
kaynak kullanıcı

oy
0

sınıflar üzerindeki dinamik yöntemleri ve özellikleri uygulamak zorunda sonra bu şikayet gelen typescript derleyici önlemek için ile gitmek başardı çözümdü:

...
window.alert(greeter['greetName']('Name'));

Temel olarak, dirsek yöntemi kullanmak özelliği erişimcileri .

Cevap 26/08/2016 saat 01:56
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more