【问题标题】:how to cast this function type in typescript如何在打字稿中转换此函数类型
【发布时间】:2018-12-27 08:55:48
【问题描述】:

我对如何在 TS 中进行这种类型转换感到困惑。我正在定义一个需要是这种类型的类方法(https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/react-big-calendar/index.d.ts#L229

我正在尝试做这样的事情......

  public onSelectSlot: Pick<BigCalendarProps<InterviewEvent>, 'onSelectSlot'> = (slot) => {
    this.setCreateDialog(true, slot.slots.slice(0, -1));
  }

但这不起作用,我无法弄清楚如何将函数 arg 类型从链接中的该接口中拉出。我该怎么做?

【问题讨论】:

  • (slot: { start: stringOrDate, end: stringOrDate, slots: Date[] | string[], action: 'select' | 'click' | 'doubleClick' }) =&gt; ...?
  • 对...但我想避免从@types模块中逐字复制类型,以防将来发生变化
  • 然后请bigcalendar的作者定义并导出一个命名接口。或者自己定义。

标签: typescript


【解决方案1】:

您正在使用Pick,它不会返回属性的类型,而是返回具有所选属性的对象类型。

您可以使用类型查询来获取onSelectSlot 的类型。

  public onSelectSlot: BigCalendarProps<InterviewEvent>['onSelectSlot'] = (slot) => {
    this.setCreateDialog(true, slot.slots.slice(0, -1));
  }

【讨论】:

  • 酷,我以前从未见过这样的做法,这很不寻常吗?我正要进行 PR 以将 arg 类型抽象为接口
  • 我经常使用它。不知道它有多常见。使用类型查询为您使用的每个回调创建不同的导出类型是不切实际的(只是命名会有问题),您可以轻松获取库中任何属性的类型..
【解决方案2】:

Pick 返回一组属性

type Pick<T, K extends keyof T> = { [P in K]: T[P]; }

所以如果你想得到一个属性,你需要像这样提供属性的键

public onSelectSlot: Pick<
    BigCalendarProps<InterviewEvent>,
    'onSelectSlot'
  >['onSelectSlot'] = slot => {};

或者你可以定义一个类型别名

type PickPropertie<T, K extends keyof T> = T[K];

并使用它。

public onSelectSlot: PickPropertie<
    BigCalendarProps<InterviewEvent>,
    'onSelectSlot'
  > = slot => {};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 2019-06-05
    • 2018-12-17
    • 2021-07-20
    • 2022-10-22
    • 2021-02-14
    • 2023-01-20
    相关资源
    最近更新 更多