我目前正在用TypeScript编写类工厂,并且想返回一个类型作为函数的输出。尽管TypeScript将类型作为输入进行处理-即泛型-美观地,我还没有找到一种将类型作为输出处理的方法。
This StackOverflow question on class factories提供了一个特别有用的解决方案,但没有完全回答我的问题。鉴于以下结构,
function factory(someVar: any) {
return class A {
// Do something with someVar that makes this class unique
}
}
这个问题表明,应该对该工厂函数的输出执行以下操作:
import factory from "someLocation";
const AClass = factory({foo: "bar"});
type A = InstanceType<typeof AClass>;
interface IData {
someField: A;
}
我有兴趣在工厂功能中包含此功能,以使系统更可重用或模块化。但是,如最初所述,我不确定如何从函数中返回类型。如果尝试以下操作,TypeScript会引发错误[ts] 'MenuState' only refers to a type, but is being used as a value here. [2693]
:
function factory(someVar: any) {
class AClass {
// Do something with someVar that makes this class unique
}
type A = InstanceType<typeof AClass>;
return A;
}
我该怎么办?通常,是否有任何语义上正确的方式将类型作为值或变量来处理?如果不是,为什么这违反了TypeScript中的最佳实践?此外,如果可能的话,该如何将这种类型用作构造函数?
答案 0 :(得分:1)
在语义上有没有正确的方法来将类型作为值或变量处理
不。类型仅在编译时。将类型表示为值(可在运行时使用)与语言设计非目标#5 in this list的直接矛盾:
添加或依赖程序中的运行时类型信息,或者根据类型系统的结果发出不同的代码。相反,应鼓励不需要运行时元数据的编程模式。
唯一的例外是类,它们在运行时表示的方式与在es6 javascript运行时中表示的方式完全相同:作为构造函数。
因此您可以从函数中返回类,但是该函数将返回一个值,该值不能用作类型。唯一的例外(某种程度上)是,您可以使用函数调用表达式来代替extends
中的类作为基类。
另外,这个构造
InstanceType<typeof AClass>
被编译器缩减为AClass
,如this type declaration中T
的{{1}}的工具提示中所示,
type T = AClass