Kesin alanlara sahip ve ek herhangi bir özelliği olabilecek TypeScript nesne arayüzü nasıl ilan edilir


Redux Eylem Türünün beyanıyla ilgili bazı sorunlarım var. Tanım gereği Redux Eylemi type özelliğine sahip olmalı ve bazı diğer özelliklere sahip olabilir.

HandBook'taki TypeScript arayüzleri sayfasına göre (bkz. "Fazla Özellik Kontrolleri") bunu şöyle yapabilirim:

interface IReduxAction {
  type: string;
  [propName: string]: any;
}

Ve bazı durumlarda işe yarıyor gibi görünüyor (örneğin bir değişkenin deklarasyonu gibi)

const action: IReduxAction = {
  type: 'hello',
  value: 'world'
};

Ama eğer aksiyonu kullanan bir fonksiyon tanımlamaya çalışıyorsam:

function hello(state = {}, action: IReduxAction) {
  return { type: action.type, text: action.text };
}

Şuna dair bir ileti ile başarısız oluyor: "Property text does not exist on type IReduxAction".

Ben neyi yanlış yapıyorum? Genel işlem tipini nasıl tanımlarım?

TypeScript oyun alanındaki canlı örnek burada

Not: "Benzer" soruları, örneğin Neden "Object literal yalnızca bilinen özellikleri belirtebilir" hatası alıyorum? gibi soruları kontrol ettim ve orada çözümü bulamadım...

Not: Görünüşe göre TypeScript'in en son sürümünde gerçekten çalışıyor.

Cevap #1

Aynı sayfada, başlığı Indexable Types olan bölümde bunun hakkında konuşuluyor.

Bunu yapmanız gerekecek:

function hello(state = {}, action: IReduxAction) {
    return { type: action.type, text: action["text"] };
}

Arayüz tanımınızın, dizin olarak string (anahtar) ve herhangi bir (değer) içerecek şekilde tanımlandığı gibi.

İlgili makaleler