如何根据传递的类确定构造函数的类型?

时间:2020-07-12 00:33:38

标签: typescript

const createObject = (ClassName: any, constructorProps: any) => {
  return new ClassName(constructorProps)
}

interface IProps {
  text: string;
}

class Class {
  constructor({text}: IProps) {
    console.log(text);
  }
}

const obj = createObject(Class, {name: ''}) //no error

在这种情况下,我可以将第二个参数中的任何对象传递给createObject。如何根据类构造函数类型创建第二个参数?建议仍然保持该示例中的createObject调用。

1 个答案:

答案 0 :(得分:0)

使用any本质上是在要求编译器不要给您错误;任何值都可以分配给any类型,而any类型可以分配给任何其他类型,因此您可以编写createObject("hello", "goodbye");并从编译器中获取任何错误。

为了开始加强某种类型的安全性,您希望ClassName自变量具有构造函数调用签名;也就是说,它应该是带有一个参数的“ newable”。像ClassName: new (arg: any) => any之类的东西。

为了表示ClassName的自变量与constructorProps的类型相同的约束,createObject()函数必须是该类型的generic。如果使它在构造函数的返回类型中通用,也将有所帮助,以便编译器了解createObject()的结果。

这是我写打字的方式:

const createObject = <A, T>(ClassName: new (arg: A) => T, constructorProps: A) => {
    return new ClassName(constructorProps);
}

现在您应该获得更合理的行为:

const obj = createObject(Class, { name: '' }) // error!
const betterObj = createObject(Class, { text: "" }); // okay
// const betterObj: Class

除非您传入IProps,否则编译器会抱怨,并且它知道会出现Class实例。


好的,希望能有所帮助;祝你好运!

Playground link to code