如何将对象的所有属性值用作类型?

时间:2019-07-17 17:31:44

标签: typescript

我正在尝试创建一个类来处理我的应用中的CustomEvent。到目前为止的样子:

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的有效事件,它是的 value 该对象中的任何属性,而不是任何道具的。我不太清楚如何做到这一点,如果有人有任何指点,将不胜感激!

1 个答案:

答案 0 :(得分:0)

首先,您对womens%7cshoes%ctrainer&pageSize=60&freeText=shoes30 api_info:"womens%7cshoes%ctrainer&pageSize=60", api_search:"shoes30" mens%7trainers&pageSize=90 api_info:"mens%7trainers&pageSize=90", api_search:null 的定义使您可以使用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];