【问题标题】:Typescript definition function to get instance based on parameter class?基于参数类获取实例的打字稿定义函数?
【发布时间】:2020-08-30 13:38:44
【问题描述】:
  1. 一个基类。
class A {}
  1. B、C 扩展 A
class B extends A {}

class C extends A {}
  1. 使用函数创建实例。
namespace D {
  function NewInstance<T extends A = A>(iclass: T): T;
}

想要:移除 &lt;T extends A&gt; 并根据输入类自动确定返回类型。

D.NewInstance(B) =&gt; B, D.NewInstance(C) =&gt; C

目前:如果我不设置泛型,D.NewInstance(B) =&gt; AD.NewInstance(C) =&gt; A

【问题讨论】:

    标签: typescript definition


    【解决方案1】:

    感谢@Karthick Vinod,但我的函数的参数是一个类。

    回答我自己的问题。关键是util类型type Newable&lt;T&gt; = new (...args: any[]) =&gt; T;

    abstract class A {
      a: number = 1;
    
      abstract aa(): void;
    }
    
    class B extends A {
      bb: number = 2;
    
      aa(): void {}
    }
    
    class C extends A {
      cc: number = 3;
    
      aa(): void {}
    }
    
    type Newable<T> = new (...args: any[]) => T;
    
    function NewInstance<T extends A>(iclass: Newable<T>): T {
      return new iclass();
    }
    
    const a = NewInstance(A); // error, A is not newable
    
    const b = NewInstance(B); // return B
    console.log(b.a); // ok
    console.log(b.bb); // ok
    b.aa(); // ok
    
    const c = NewInstance(C);
    console.log(c.a);
    console.log(c.cc);
    c.aa();
    

    【讨论】:

      【解决方案2】:

      删除泛型函数声明中的默认类型应该可以使事情按您的预期工作。

      interface A { }
      interface B extends A { }
      
      function NewInstance<T extends A>(iclass: T): T { 
        return iclass
      }
      
      const a: A = {}
      const b: B = {}
      
      NewInstance(a) // return A
      NewInstance(b) // return B
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-15
        • 1970-01-01
        • 2021-09-05
        • 2021-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        相关资源
        最近更新 更多