代码之家  ›  专栏  ›  技术社区  ›  Seph Reed

我怎样才能使一个函数在Typescript中接受其中一个参数的参数?

  •  1
  • Seph Reed  · 技术社区  · 7 年前

    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);
    

    这里我遇到的最大问题是获取基类的参数类型。有可能吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Titian Cernicova-Dragomir    7 年前

    您可以在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
    
    推荐文章