javascript - TypeScript'te arayüzler için prototipleri uygulama


Servis sonuçlarım için bir TypeScript arayüzü oluşturdum. Şimdi içindeki iki işlevim için temel bir işlevsellik tanımlamak istiyorum. Sorun şu ki bir hata alıyorum:

'ServiceResult' özelliği, 'Support' türündeki değerde mevcut değil.

Geliştirme için WebStorm kullanıyorum (VS2012 beni gerginleştiriyor çünkü büyük projelerde donuyor - daha iyi entegrasyonu bekliyorum :P).

İşte bunu nasıl yapıyorum:

module Support {
    export interface ServiceResult extends Object {
        Error?: ServiceError;
        Check?(): void;
        GetErrorMessage?(): string;
    }
}

Support.ServiceResult.prototype.Check = () => {
   // (...)
};

Support.ServiceResult.prototype.GetErrorMessage = () => {
   // (...)
};

Prototiplerimi modüle taşımayı da denedim, ama aynı hata devam ediyor... (tabii ki Support. önekini kaldırdım).

Cevap #1

Bir arayüzü prototipleştiremezsiniz çünkü derlenmiş JavaScript arayüzle ilgili hiçbir şey üretmez. Arayüz tamamen derleme zamanı kullanımı için vardır. Şuna bir göz atın:

Bu TypeScript:

interface IFoo {
    getName();
}

class Foo implements IFoo {
    getName() {
        alert('foo!');
    }
}

Buna JavaScript'e derlenir:

var Foo = (function () {
    function Foo() { }
    Foo.prototype.getName = function () {
        alert('foo!');
    };
    return Foo;
})();

Sonuçta hiç IFoo yok, bu yüzden o hatayı alıyorsunuz. Genellikle bir arayüzü prototiplemezsiniz, arayüzünüzü uygulayan bir sınıfı prototiplersiniz.

Prototipi kendiniz yazmak zorunda bile değilsiniz, sadece arayüzü bir sınıf olarak uygulamak yeterlidir ve TypeScript derleyicisi prototipi sizin için ekleyecektir.

Cevap #2

Görünüşe göre bir arayüze uygulama eklemeye çalışıyorsunuz - bu mümkün değil.

Gerçek bir implementasyona, örneğin bir sınıfa, yalnızca ekleme yapabilirsiniz. Ayrıca prototype kullanmak yerine implementasyonu doğrudan sınıf tanımına eklemeye karar verebilirsiniz.

module Support {
    export interface ServiceResult extends Object {
        Error?: ServiceError;
        Check?(): void;
        GetErrorMessage?(): string;
    }

    export class ImplementationHere implements ServiceResult {
        Check() {

        }

        GetErrorMessage() {
            return '';
        }
    }
}

Support.ImplementationHere.prototype.Check = () => {
   // (...)
};

Support.ImplementationHere.prototype.GetErrorMessage = () => {
   // (...)
};

İlgili makaleler