带有可变数量参数的函数的通用打字稿

时间:2019-12-18 09:21:24

标签: typescript generics types

我有一个函数,可以接受任意数量的类。

function findObjects(...Classes) { ... }

所有类都从一个Component类继承。此功能以某种方式搜索作为这些类的实例的对象。

如何为具有可变参数数量的函数实现模板?

应该是这样的:

function findObjects(...Classes): [...Classes] { ... }

这对于正确定义类型和正确操作智能感知是必需的。

3 个答案:

答案 0 :(得分:1)

您可能想看看tuple rest parameters,它用于模拟带有variable number of parameters的函数。可能的解决方案:

Partial<T>

对于返回类型,我使用了undefined,它是传入类中的mapped tuple with optional elements。如果您的findObjects实现将相应的类项过滤掉,则它在索引处包含params_constrained = params.copy() params_constrained['monotone_constraints'] = "(1,-1)" model_with_constraints = xgb.train(params_constrained, dtrain, num_boost_round = 1000, evals = evallist, early_stopping_rounds = 10) (根据需要调整返回类型)。

Playground

答案 1 :(得分:1)

您可以使用docs

中所述的rest参数
25

希望有帮助!

答案 2 :(得分:1)

我的回答遵循您所写的内容:

  

所有类都从一个Component类继承。此功能以某种方式搜索作为这些类的实例的对象。

因此,在解决方案中,我使用了一些基类Component并搜索了一些子类成员SubComponent

// some empty classes
class Component {}
class SubComponent extends Component {}

function findObjects(...args: Component[]): SubComponent[] { 
  return args.filter(el => el instanceof SubComponent); // do some by instanceof for example
}
// using
const results = findObjects(new Component(), new Component(), new SubComponent());
// results is an array only with SubComponent element

该函数的定义如下-findObjects(...args: Component[]): SubComponent[]

  • ...args: Component[]-我们将未知数量的Component实例作为参数
  • : SubComponent[]-我们返回SubComponents的数组

我建议改变一点定义,当我们返回数组时,最好还是采用数组:

function findObjects(arr: Component[]): SubComponent[] { 
  return arr.filter(el => el instanceof SubComponent); // do some instanceof for example
}
// using
const results = findObjects([new Component(), new Component(), new SubComponent()]);
// results is an array only with SubComponent element

请注意,现在参数为一个-arr,但它与输出一致,我们将array放入,然后取出array。不过只是一个建议。