मैं अपने ऐप में CustomEvents को संभालने के लिए एक क्लास बनाने की कोशिश कर रहा हूं। यहाँ यह अब तक कैसा दिखता है:

export const EVENT_NAMES = {
  TEST_EVENT: 'HELLO_WORLD',
  THIS_IS: 'REALLY_HARD'
};

export type EventName = keyof typeof EVENT_NAMES;

export class Events {
  static on(eventName: EventName, eventHandler: Function): void {
    document.addEventListener(eventName, (e: CustomEvent): void => {
      eventHandler(e.detail);
    });
  }
}

/* 
    Want to do this, but TypeScript complains:
    Argument of type 'string' is not assignable to parameter of type 
    '"TEST_EVENT" | "THIS_IS"'. ts(2345)
*/   
Events.on(EVENT_NAMES.TEST_EVENT, () => {
  // handle the event
});

मैं यह लागू करना चाहता हूं कि eventName तर्क को Events.on में दिया गया कोई भी मान एक मान्य घटना है जो EVENT_NAMES से संबंधित है, जो कि किसी भी संपत्ति का मान है वह वस्तु, किसी प्रोप की कुंजी नहीं है। मैं यह नहीं समझ सकता कि इसे कैसे पूरा किया जाए, और अगर किसी के पास कोई संकेत है, तो इसकी बहुत सराहना की जाएगी!

2
Kyle 17 जुलाई 2019, 20:31

1 उत्तर

सबसे बढ़िया उत्तर

सबसे पहले, आपकी EventName की परिभाषा आपको EVENT_NAMES की कुंजियों का उपयोग आपके तर्क के रूप में करने के लिए सेट करती है, मानों के रूप में नहीं। दूसरा, मानों के प्रकार तार हैं। आप as का उपयोग करने वालों को कास्ट कर सकते हैं:

const EVENT_NAMES = {
  TEST_EVENT: 'HELLO_WORLD',
  THIS_IS: 'REALLY_HARD'
} as const;

// 'HELLO_WORLD' | 'REALLY_HARD'
export type EventName = typeof EVENT_NAMES[keyof typeof EVENT_NAMES];

अब, यह काम करना चाहिए:

Events.on(EventNames.HELLO_WORLD, () => {});
1
Wex 18 जुलाई 2019, 01:12