枚举键上的打字稿条件类型

时间:2021-05-13 13:05:15

标签: typescript conditional-statements typescript-typings

我虽然这很简单,但显然我错了。如何基于枚举键创建简单的条件类型?像这样:

export enum inputTypes {
  text = 'text',
  email = 'email',
  password = 'password',
  number = 'number',
  date = 'date',
  textarea = 'textarea',
  dropdown = 'dropdown',
  checkbox = 'checkbox',
}

export interface IInput {
  id: string,
  type: inputTypes,
  name: string,
}

以及基于 inputType 的条件类型:

export type onInputChange =
IInput['type'] extends inputTypes.dropdown
? DropDownChangeEventHandler
: FormChangeEventHandler;

我尝试了 keyof typeof keyof typeof 的一些变体,但无法达到我想要的效果。

我需要的最终结果是,如果输入类型是下拉列表,我希望有一个不同的更改事件。所以我的 type onInputChange 将等于:DropDownChangeEventHandler | FormChangeEventHandler,然后在代码中执行类型保护并获取下拉更改事件的正确类型。

1 个答案:

答案 0 :(得分:1)

我不确定我是否正确理解了您要执行的操作,但我认为问题可能与您在 onInputChange 类型上的情况有关:

export type onInputChange =
   IInput['type'] extends inputTypes.dropdown
   ? DropDownChangeEventHandler
   : FormChangeEventHandler;

你在这里说的是:如果 type 接口上的属性 IInput 的类型扩展 'dropdown' 给我类型 DropDownChangeEventHandler 否则给我类型 {{1} }.

关键是条件永远不会成立,因为您将 FormChangeEventHandler 上的 type 定义为 IInput。枚举类型定义了每个枚举成员的联合,inputTypes 将始终为 false。

我想,您实际想要检查的条件不是 'foo' | 'bar' extends 'foo' 接口上的 type 属性类型,而是特定接口上 IInput 属性的类型 该接口的实现。显然,只有在您实现了接口后,这些信息才可用。

一种方法可能是使用泛型:

type