在TypeScript

时间:2019-01-19 02:04:19

标签: javascript typescript object types factory

我目前正在用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中的最佳实践?此外,如果可能的话,该如何将这种类型用作构造函数?

1 个答案:

答案 0 :(得分:1)

  

在语义上有没有正确的方法来将类型作为值或变量处理

不。类型仅在编译时。将类型表示为值(可在运行时使用)与语言设计非目标#5 in this list的直接矛盾:

  

添加或依赖程序中的运行时类型信息,或者根据类型系统的结果发出不同的代码。相反,应鼓励不需要运行时元数据的编程模式。

唯一的例外是类,它们在运行时表示的方式与在es6 javascript运行时中表示的方式完全相同:作为构造函数。

因此您可以从函数中返回类,但是该函数将返回一个值,该值不能用作类型。唯一的例外(某种程度上)是,您可以使用函数调用表达式来代替extends中的类作为基类。

另外,这个构造

InstanceType<typeof AClass>

被编译器缩减为AClass,如this type declarationT的{​​{1}}的工具提示中所示,

type T = AClass