knockout.js - TypeScript'te bir knockout binding handler'ı nasıl tanımlarım?
JavaScript üzerinden genellikle özel knockout binding handler'ları eklerim
ko.bindingHandlers.myBindingHandler = {...}
ama şimdi onları TypeScript aracılığıyla eklemem gerekiyor
ko.bindingHandlers["myBindingHandler"] = {...}
aksi takdirde typescript.d.ts kullandığım için bu hatayı alıyorum:
'myBindingHandler' özelliği 'KnockoutBindingHandlers' türündeki değerde mevcut değil
Ben ["property"] yaklaşımını sevmiyorum çünkü sonra ona başvuramıyorum veya sonrasında intellisense alamıyorum.
Peki, DefinitelyTyped'in knockout tanımını kullanırken, kendi özel binding handler'ımı knockout'a nasıl ekleyebilirim ve aynı zamanda tanımımı intellisense vb. aracılığıyla referans gösterebilirim?
Cevap #1
Özel bir bağlama işleyicisi tanımlamak
Aslında oldukça kolay, sadece bunu (myBindingHandler) KnockoutBindingHandlers arayüzüne ekleyin özel binding handler'ınızı tanımlamadan hemen önce. Lütfen, bu eklemeyi 1.0 sürümünden itibaren (veya muhtemelen daha önce) bir .d.ts dosyası içinde arayüze yapmanız gerektiğini unutmayın.
bindingHandlers.d.ts
/// <reference path="typings/knockout/knockout.d.ts" />
interface KnockoutBindingHandlers {
myBindingHandler: KnockoutBindingHandler;
}
myBindingHandler.ts
/// <reference path="bindingHandler.d.ts" />
ko.bindingHandlers.myBindingHandler = {...}
Şimdi her şey çalışıyor. Bu, mevcut tanımlamaların veya deklarasyonların üzerine yazmayacaktır, bu yüzden tanımınız ko.bindingHandlers.text gibi diğerlerinin yanında duracaktır.
Dikkatli olun, çünkü eğer myBindingHandler için gerçek bir tanım eklemezseniz ve bunu başka bir yerde referans gösterirseniz, KnockoutBindingHandlers içine eklediğiniz tanım nedeniyle derleme yapılır, ancak myBindingHandler için bir uygulama olmadığı için çalışma zamanında hata verir.
Knockoutjs'te özel bindinghandler eklemekle ilgili dokümantasyon burada
TypeScript ile özel fonksiyonlar eklemek için fn kullanma
Benzer şekilde, ko.observable.fn'ye bir şey eklemek için bunu typescript'te yaparsınız
interface KnockoutObservableFunctions {
myFnExtension(args: any): returnType;
}
ve bunu ... ile çağır
// x will be defined as a returnType automatically, but you could specify it if you like, either way
var x: returnType = ko.observable("value").myFnExtension(args);
Not: subscribable, observable, observableArray ve computed türleri için farklı arayüzler bulunmaktadır:
ko.subscribable.fn...KnockoutSubscribableFunctions'e ekleko.observable.fn...KnockoutObservableFunctions'a ekleko.observableArray.fn...KnockoutObservableArrayFunctions'a ekleko.computed.fn...KnockoutComputedFunctions'e ekle
Knockoutjs'te fn ekleme ile ilgili dokümantasyon burada
Cevap #2
Bunu basitçe yok sayabilirsiniz, ancak bu iyi bir uygulama değildir, any'ye dönüştürerek myBindingHandler özelliğinin türünü tanımlamıyorsunuz
(<any>ko.bindingHandlers).myBindingHandler = { ... };
