【问题标题】:Create function overload defined on type创建在类型上定义的函数重载
【发布时间】:2021-07-29 22:43:48
【问题描述】:

如何使用在这样的类型上定义的重载函数:

function myFunction<T, U extends keyof T>(keys: U[]): Pick<T, U>
function myFunction<T, TSelected = unknown>(funcArg: (state: T) => TSelected): TSelected;

type HoneyState<T> = {
  getValue: myFunction<T>
}

TS Playground Link

这样做会给我错误:

'myFunction' 指的是一个值,但在这里被用作一个类型。您的意思是“typeof myFunction”吗?

在类型上使用重载函数的正确方法是什么?将它们合二为一是行不通的,因为返回类型不同

【问题讨论】:

  • 那里的错误信息似乎很清楚,当你做它说你应该做的事情时,它会做你想做的事情吗?
  • @AlexWayne 如何在不直接在类型上使用的情况下对上述类型使用函数?如果我直接在类型上执行,它不允许重载:)
  • typeof myFunction 不是正确的解决方案
  • 那个游乐场链接给你两个错误;首先是您的重载函数没有实现。如果这不是您要问的问题,您能否修复它以使此处的代码为minimal reproducible example?这个问题似乎也与重载无关,更多地与泛型函数和泛型类型之间的区别有关,如this question and its answer 所示。您不能轻易让编译器更改泛型类型参数的范围。

标签: typescript


【解决方案1】:

由于 typescript 目前不支持更高种类的类型 (microsoft/TypeScript#1213),因此您的代码将无法按预期工作。但是,这里的用例中有一个解决方法。您可以创建一个与上述函数同名的类型,并将其用于您想要的输入目的。见以下代码:

interface myFunction<T> {
    <U extends keyof T>(keys: U[]): Pick<T, U>;
    <TSelected = unknown>(funcArg: (state: T) => TSelected): TSelected;
}

type HoneyState<T> = {
  getValue: myFunction<T>
}

Playground Link

【讨论】:

  • 这就是我一直在寻找的答案,谢谢!不幸的是,由于支持重载,因此必须有这样的解决方法。欣赏!
猜你喜欢
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
相关资源
最近更新 更多