【问题标题】:Returning a Type as a Variable in TypeScript在 TypeScript 中将类型作为变量返回
【发布时间】:2019-01-19 10:35:05
【问题描述】:

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

【问题讨论】:

    标签: javascript typescript object types factory


    【解决方案1】:

    是否有任何语义上正确的方法来处理类型作为值或变量

    没有。类型只是编译时的。将类型表示为在运行时可用的值与语言设计非目标 #5 in this list 直接矛盾:

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

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

    所以你可以从一个函数返回一个类,但函数将返回一个值,它不能用作类型。唯一的例外(有点)是您可以使用函数调用表达式而不是类作为extends 中的基类。

    还有,这个结构

    InstanceType<typeof AClass>
    

    编译器将其缩减为仅AClass,如this type declarationT 的工具提示中所示type T = AClass

    type T = InstanceType<typeof AClass>;
    

    【讨论】:

    • 啊,明白了——我有一段时间没看手册了。谢谢你指点我!出于好奇,更一般地说,是否存在任何编程范式或模式,可以通过它动态创建类型,同时保持系统类型安全?这几乎听起来像是一个自相矛盾的陈述,但我仍然对这种可能性感兴趣。
    • 这需要一个与编译器集成的运行时环境,我很确定确实存在这样的语言,但我现在不记得了。在 TypeScript 上下文中,这通常是通过类型推断完成的,并且仅限于实际上是对象字面量的“动态”值。
    • 知道了。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 2019-01-15
    • 1970-01-01
    • 2020-11-21
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多