构造函数作为参数:推断类的泛型为函数

时间:2020-06-12 18:42:02

标签: typescript

在此示例中,如何使打字稿编译器推断正确的类型?

interface A<T> {
  do(param: T): void
}

class A2 implements A<string>{
  do(param){}
}

function createA<T>(constr: new () => A<T>, param: T){}

createA(A2, "")

这里不会编译,并且T被推断为any

2 个答案:

答案 0 :(得分:2)

您还需要使类具有通用性,以便可以告诉typescript接口参数和function参数是同一类型,而无需重复自己的操作:

SubSystem Name  Entity1   Entity2   Entity3   Entity4   Entity5
SubSys1         ON        OFF       ON        OFF       OFF          
SubSys2         ON        OFF       ON        ON        OFF
SubSys3         OFF       ON        ON        OFF       OFF
SubSys4         ON        OFF       ON        OFF       OFF
SubSys5         ON        OFF       ON        OFF       OFF

Playground

答案 1 :(得分:1)

我认为,如果您使用do(param: string)类实现A<string>接口,则必须使其A2。如果尝试为其提供任何其他类型,则应该得到一个错误,因为例如,如果您在do(param: number)实现中使用A<string>,则会得到

Property 'do' in type 'A2' is not assignable to the same property in base type 'A<string>'.
  Type '(param: number) => void' is not assignable to type '(param: string) => void'.
    Types of parameters 'param' and 'param' are incompatible.
      Type 'string' is not assignable to type 'number'