网站搜索

typescript - 有没有一种方法可以在表达式中使用 typeof?


我想在一个表达式中使用 TypeScript 的 typeof 操作符。

我从文档中知道这是设计上无法实现的,但我想知道是否存在一种方法可以让我突破限制来实现这个目标:

function a_function<T>()
{
    return {} as any
}

const a_value = a_function<true>()

type UsingConst = typeof a_value                // OK
type WithoutConst<T> = typeof (a_function<T>()) // Is there a hack ?

操场


编辑:我已经添加了完整的使用案例,以避免对为什么我可以使用这个技巧产生混淆。目标是在我开发类型时标准化我的快速测试。

答案#1

TypeScript 没有 实例化类型,即你可以在不调用泛型函数的情况下指定类型参数并查看生成的函数类型。如果有,你可能可以写 ReturnType<typeof a_function<T>>。但你不能。有实例化 表达式,所以你可以写 const f=a_function<true> 和 ReturnType<typeof f>,但这不能帮助去掉 const。正如你所见,你不能对任意表达式 expr 写 typeof expr,所以 typeof a_function<T>() 对 TypeScript 也没有意义。这在 microsoft/TypeScript#52035 中有描述,目前这是一个设计限制或缺失的功能或一组缺失的功能。

我能想到的唯一方法是滥用泛型类,因为这可以让你在需要的地方使用泛型类型参数。也许:

class Ugh<T> {
    x = a_function<T>()
}
type WithoutConst<T> = Ugh<T>["x"]

所以这里我们已经将一个 Ugh<T> 的字段 x 初始化为 a_function<T>() 的结果。因此现在我们可以直接索引 Ugh<T> 来获取其 x 属性的类型,并且它可以正常工作。

代码的 Playground 链接