function returnType<A, B, Z>(fn: (a: A, b: B) => Z): Z
function returnType<A, Z>(fn: (a: A) => Z): Z
function returnType<Z>(fn: () => Z): Z
function returnType(): any {
throw "Nooooo"
}
function complicated(value: number): { kind: 'complicated', value: number } {
return { kind: 'complicated', value: value }
}
const dummy = (false as true) && returnType(complicated)
type Z = typeof dummy
9条答案
按热度按时间8ulbf1ek1#
编辑
从TypeScript 2.8开始,这在
ReturnType<T>
中正式成为可能。字符串
详情请参见this pull request to Microsoft/TypeScript。
TypeScript太棒了!
老派黑客
瑞安的答案不工作了,不幸的是。但我已经修改了它与黑客,我是不合理的高兴。看:
型
它的工作原理是将
false
转换为true
的文字值,这样类型系统就认为返回值是函数的类型,但当你实际运行代码时,它会在false
上短路。qojgxg4l2#
在TypeScript 2.8中最简单的方法:
字符串
d6kp6zgx3#
使用内置
ReturnType
:字符串
ReturnType
扩展为:型
r6hnlfcb4#
下面的代码不需要执行函数就可以工作。它来自react-redux-typescript库(https://github.com/alexzywiak/react-redux-typescript/blob/master/utils/redux/typeUtils.ts)
字符串
gj3fmq9x5#
没有办法做到这一点(请参阅https://github.com/Microsoft/TypeScript/issues/6606了解添加此功能的工作项跟踪)。
一个常见的解决方法是写这样的东西:
字符串
qmb5sa226#
ReturnType<F>
给出返回类型。请参阅接受的答案。*我使用的是前面一些答案的变体,它在
strictNullChecks
中工作,并稍微隐藏了推理技巧:字符串
使用方法:
型
它确实调用了
getReturnType
函数,但它并没有调用原来的函数。你可以使用(false as true) && getReturnType(foo)
来阻止getReturnType
的调用,但在我看来,这只会让它更加混乱。我只是使用这个方法和一些regexp find/replace来迁移一个旧的Angular 1.x项目,这个项目有大约1500个像这样写的工厂函数,最初是在JS中,并添加了
Foo
等类型来使用所有用途......令人惊讶的是,你会发现坏掉的代码。5q4ezhmt7#
如果所讨论的函数是用户定义类的方法,您可以使用方法装饰器结合Reflect Metadata来确定 * 运行时 * 的返回类型(构造函数)(并使用它,做您认为合适的事情)。
例如,您可以将其记录到控制台:
字符串
只需将此方法装饰器对齐到您选择的方法上,就可以获得对对象的构造函数的精确引用,该对象的构造函数应该是从方法调用返回的。
型
然而,这种方法有一些明显的局限性:
Reflect.getMetadata
得到undefined,此外,你需要为typescript编译器指定以下命令行参数,因为装饰器和反射元数据都是在写这篇文章时的实验性功能:
型
ifmq2ha28#
我想出了以下方法,看起来效果不错:
字符串
ct3nt3jp9#
如果你有一个类,你想得到一个方法的返回类型:
字符串
您可以访问类的原型,以便将方法作为函数获取:
型
这是非常好的,因为有时TypeScript能够推断复杂类型分析代码