2015-11-20 20 views
6

Özet olarak, bazı temel özellikleri bildiren ancak ek özellikleri kısıtlamayan bir arabirime sahip olmak mümkün mü?Diğer özelliklere izin veren TypeScript arabirimi

Ben genel bir hareket memurunu tanımlayan Flux pattern, kullanıyorum: Sonra kendi yük türüne sahip bir hareket memurunu oluşturmak

class Dispatcher<TPayload> { 
    dispatch(arg:TPayload):void { } 
} 

böyle:

interface ActionPayload { 
    actionType: string 
} 

const dispatcher = new Dispatcher<ActionPayload>(); 
Bu benim şimdiki durum

Artık bazı ek verilerle bir yük yükünün gönderilmesi gereken bazı işlem kodum var, ancak ActionPayload arabirimi yalnızca actionType için izin veriyor. Başka bir deyişle, bu kodu:

interface SomePayload extends ActionPayload { 
    someOtherData: any 
} 

class SomeActions { 
    doSomething():void { 
     dispatcher.dispatch({ 
      actionType: "hello", 
      someOtherData: {} 
     }) 
    } 
} 

ActionPayload arayüzünü eşleşmeyen someOtherData çünkü bir derleme hatası verir. Sorun, birçok farklı "eylem" sınıfının aynı dağıtıcıyı yeniden kullanacağıdır, yani someOtherData iken burada anotherKindOfData olabilir ve böyle devam eder. Şu anda, bunu yapmak için yapabileceğim tek şey, farklı eylemler gönderileceği için new Dispatcher<any>() kullanıyor. Tüm eylemler ActionPayload tabanını paylaşıyor, bu yüzden new Dispatcher<extends ActionPayload>() veya benzeri bir şeyle sınırlı kalmayı umuyordum. Böyle bir şey mümkün mü?

cevap

1

Sanırım ne aradığımı buldum. Ben SomePayload sevk nesne artığını edebilir ve TSC dökme arayüzü ve sevk görevlisi arasında TPayload hem de onun uyumlu doğrular:

dispatcher.dispatch(<SomePayload>{ 
     actionType: "hello", 
     someOtherData: {} 
    }) 

Example online.

17

Eğer ActionPayload yapabilirsiniz başka özelliği kabul etmek istiyorsanız indexleyici ekleyin:

interface ActionPayload { 
    actionType: string, 
    [x: string]: any 
} 

https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#strict-object-literal-assignment-checking

+0

Teşekkür bakın, bu iyi bir bilgi. Aşırı basitleştirilmiş başlığımı tam olarak yanıtlıyor ... soruyu daha ayrıntılı bir şekilde kullanabilmek için ' 'genişletilmiş nesneyi yalnızca nesneyi harfle yazarak kullanmanın bir yolu çıktı. Garip soru için özür dilerim. Başlığı ve özeti düzeltmeye çalışmalıyım, örneğin, "Bir alt arabirimi nasıl uygulayabilir ve bir nesneyi tam anlamıyla bir süper arabirimi nasıl karşılayabilirim" veya yanıtınızı kabul etmeli miyim? – Aaron

+0

Biri ya da diğeri benimle iyi. Başlığı değiştirmek, soruları yansıtmak için muhtemelen daha iyidir. – Sebastien

İlgili konular