承认我有这样的功能
const createPerson = () => ({ firstName: 'John', lastName: 'Doe' })
如何在声明createPerson
之前而不声明接口或类型,获取返回值类型?
这样的事情:
type Person = typeof createPerson()
我有一个Redux容器,它将状态和调度操作映射到组件的props。
import { CounterState } from 'reducers/counter'
// ... Here I also defined MappedState and mapStateToProps
// The interface I would like to remove
interface MappedDispatch {
increment: () => any
}
// And get the return value type of this function
const mapDispatchToProps =
(dispatch: Dispatch<State>): MappedDispatch => ({
increment: () => dispatch(increment)
})
// To export it here instead of MappedDispatch
export type MappedProps = MappedState & MappedDispatch
export default connect(mapStateToProps, mapDispatchToProps)(Counter)
import { MappedProps } from 'containers/Counter'
export default (props: MappedProps) => (
<div>
<h1>Counter</h1>
<p>{props.value}</p>
<button onClick={props.increment}>+</button>
</div>
)
我希望能够导出mapDispatchToProps
的类型而无需创建MappedDispatch
界面。
我在这里减少了代码,但这让我两次输入相同的内容。
答案 0 :(得分:32)
我创建了一个允许解决方法的小库,直到将一个完全声明的方式添加到TypeScript中:
https://npmjs.com/package/returnof
还在Github上创建了一个问题,要求通用类型推断,这将允许完全声明的方式来执行此操作:
https://github.com/Microsoft/TypeScript/issues/14400
TypeScript 2.8引入了一种新的静态类型ReturnType
,它允许实现:
https://github.com/Microsoft/TypeScript/pull/21496
现在,您可以以完全声明的方式轻松获取函数的返回类型:
const createPerson = () => ({
firstName: 'John',
lastName: 'Doe'
})
type Person = ReturnType<typeof createPerson>
答案 1 :(得分:13)
这https://github.com/Microsoft/TypeScript/issues/4233#issuecomment-139978012可能有所帮助:
let r = true ? undefined : someFunction();
type ReturnType = typeof r;
答案 2 :(得分:9)
改编自https://github.com/Microsoft/TypeScript/issues/14400#issuecomment-291261491
const fakeReturn = <T>(fn: () => T) => ({} as T)
const hello = () => 'World'
const helloReturn = fakeReturn(hello) // {}
type Hello = typeof helloReturn // string
链接中的示例使用的是null as T
而不是{} as T
,但会以Type 'null' cannot be converted to type 'T'.
最好的部分是实际上没有调用作为fakeReturn
参数给出的函数。
使用TypeScript 2.5.3进行测试
TypeScript 2.8引入了一些预定义的条件类型,包括获得函数类型返回类型的ReturnType<T>
。
const hello = () => 'World'
type Hello = ReturnType<typeof hello> // string