【发布时间】:2018-10-04 22:42:22
【问题描述】:
免责声明:以下是过度简化的功能,我知道它们是 没用的
function thinger<T>(thing: T): T {
return thing;
}
const thing = thinger({ a: "lol" });
thing.a;
上面的代码编译得很好。但我需要将thinger<T> 的结果放入一个对象中。
interface ThingHolder {
thing: ReturnType<typeof thinger>;
}
const myThingHolder: ThingHolder = {
thing: thinger({ a: "lol" }),
};
但是我丢失了类型信息,所以myThingHolder.thing.a 不起作用
类型“{}”上不存在属性“a”
所以我尝试了以下
interface ThingHolder<T> {
thing: ReturnType<typeof thinger<T>>;
}
const myThingHolder: ThingHolder<{ a: string }> = {
thing: thinger({ a: "lol" }),
};
但是typeof thinger<T> 不是有效的打字稿。
如何获取基于泛型具有不同返回类型的函数的返回类型?
【问题讨论】:
-
自己搞清楚有什么问题?
interface ThingHolder<T> { thing: T }? -
正如我在文章开头的免责声明中一样,我意识到在这个过于简化的示例中我应该这样做,但我的实际用例并不是那么简单。我有一个函数接受许多泛型并返回比这些泛型更复杂的东西(但泛型仍然会影响返回类型)
-
我可以编写它,但它会非常冗长,并且每次函数更改时都需要重新编写。老实说,即使它是一个合理的解决方案,我仍然想要这个问题的答案。
-
简短的回答是“TypeScript 不能那样做”,因为它既没有 generic values、higher kinded types 也没有
typeofon arbitrary expressions。 -
这不是我的功能,它是图书馆的。我只对我的问题的答案感兴趣,这是一种获取返回类型受泛型影响的函数的返回类型的方法。或者,解释为什么这是不可能的就足够了。如果不可能,我有更简单的方法来解决我的用例。但如果可能的话,我更愿意这样做。
标签: typescript generics typescript-generics