首页 > 解决方案 > 如何制作一个函数,该函数在 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 的参数类型。有可能吗?

标签: typescript

解决方案


您可以在 3.0 中使用条件类型和元组在剩余参数和展开表达式中执行此操作

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

推荐阅读