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调用。
答案 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
实例。
好的,希望能有所帮助;祝你好运!