【问题标题】:Typescript, generic variadic factory function returning tupleTypescript,通用可变参数工厂函数返回元组
【发布时间】:2020-09-18 09:43:35
【问题描述】:

在 typescript 中,可以像这样创建工厂函数,并定义返回类型:

function factory1<T>(object: new () => T): T {
  return new object();
}

如果我想创建几个不同的对象,我可以将此函数扩展为:

function factory2<T, U>(object1: new () => T, object2: new () => U): [T, U] {
  return [new object1(), new object2()];
}

现在我的问题是:这个工厂模式是否可以推广为采用任意数量的不相关对象类型并仍然返回一个类型化的元组?或者是放弃强类型并恢复使用强类型的唯一选择?

类似这样的:

function factory3<T extends any[]>(...objects: {new(): any}[]): [...T] {
  // BODY
}

最后一个 factory3 的问题是我们丢失了 T 的类型,而是得到了“typeof T”。例如:

    factory3(ClassA, ClassB, ClassC);

// actually becomes this:

    factory3<typeof ClassA, typeof ClassB, typeof ClassC>(...) : [typeof ClassA, typeof ClassB, typeof ClassC] {}

// But we want this to happen instead, which is possible for factory 1:

    factory3<typeof ClassA, typeof ClassB, typeof ClassC>(...) : [ClassA, ClassB, ClassC] {}

【问题讨论】:

    标签: javascript typescript generics


    【解决方案1】:

    当然,您可以将工厂休息参数设为mapped array/tuple type。你需要type assertion 或类似的东西来让编译器相信正文中的返回值确实是[...T]

    function factory<T extends any[]>(...ctors: { [K in keyof T]: new () => T[K] }) {
        return ctors.map(x => new x) as [...T];
    }
    

    您可以验证这是否有效:

    class A {
        x = 1;
    }
    class B {
        u = "u";
    }
    class C {
        s = true;
    }
    
    const objects = factory(A, B, C);
    // const objects: [A, B, C]
    console.log(JSON.stringify(objects)); // [{"x":1},{"u":"u"},{"s":true}] 
    

    Playground link to code

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-04
      • 2017-08-05
      • 1970-01-01
      • 2019-03-23
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      • 2021-05-04
      相关资源
      最近更新 更多