我如何制作一个在Typescript中使用其中一个参数的参数的函数?

时间:2018-10-25 23:28:32

标签: typescript

这可能是不可能的,但无论如何我都在尝试。我想制作一个大致类似于以下伪代码的函数:

function modifyClass<MOD_ME extends SomeClass>(
  baseClass: typeof MOD_ME, 
  args: ...MOD_ME.arguments
): MOD_ME {
  args[1] = "second arg is always this string";
  return new baseClass(...args);
}

这样做的目的是能够在没有所有原型东西的情况下完成与装饰器大致相似的操作。我希望能够在包装类构造函数时进行类型检查。这样的函数调用:

import MyClass from "./MyClass"
import modifyClass from "./modifyClass"

const moddedClassInstance = modifyClass(MyClass, myClassArg1, myClassArg2);

我遇到的最大问题是获取任何baseClass参数的类型。有可能吗?

1 个答案:

答案 0 :(得分:1)

您可以在3.0中使用条件类型和Tuples in rest parameters and spread expressions

type CtorArgumentTypes<T extends new (...args: any[]) => any> = T extends new (...args: infer A) => any ? A : []
function modifyClass<MOD_ME extends new (...args: any[]) => any>(
    baseClass: MOD_ME, 
    ...args: CtorArgumentTypes<MOD_ME>
): InstanceType<MOD_ME> {
    return new baseClass(...args);
}

class Test {
    constructor(public n: number, public s: string) {

    }
}

let o = modifyClass(Test, 10, ""); //ok
let o2 = modifyClass(Test, "", ""); // error