sumar - typescript fundamentos
TipoScript tipo de funciĆ³n Valor de retorno (3)
Mensaje original
TypeScript <2.8
Creé una pequeña biblioteca que permite una solución alternativa, hasta que se agrega una forma totalmente declarativa a TypeScript:
https://npmjs.com/package/returnof
También se creó un problema en Github, que pedía una Inferencia de tipos genéricos , que permitiría una forma totalmente declarativa de hacer esto:
https://github.com/Microsoft/TypeScript/issues/14400
Actualización febrero 2018
TypeScript 2.8
TypeScript 2.8 introdujo un nuevo tipo estático ReturnType
que permite lograr eso:
https://github.com/Microsoft/TypeScript/pull/21496
Ahora puede obtener fácilmente el tipo de retorno de una función de forma totalmente declarativa:
const createPerson = () => ({
firstName: ''John'',
lastName: ''Doe''
})
type Person = ReturnType<typeof createPerson>
Admito que tengo una función como esta
const createPerson = () => ({ firstName: ''John'', lastName: ''Doe'' })
¿Cómo puedo, sin declarar una interfaz o un tipo antes de declarar createPerson
, obtener el tipo de valor de retorno?
Algo como esto:
type Person = typeof createPerson()
Escenario de ejemplo
Tengo un contenedor de Redux que asigna acciones de estado y de envío a elementos de un componente.
contenedores / Counter.tsx
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)
componentes / Counter.tsx
import { MappedProps } from ''containers/Counter''
export default (props: MappedProps) => (
<div>
<h1>Counter</h1>
<p>{props.value}</p>
<button onClick={props.increment}>+</button>
</div>
)
Quiero poder exportar el tipo de mapDispatchToProps
sin tener que crear la interfaz MappedDispatch
.
Reduje el código aquí, pero me hace escribir lo mismo dos veces.
Adaptado de 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
El ejemplo en el enlace usa null as T
lugar de {} as T
, pero eso rompe con el Type ''null'' cannot be converted to type ''T''.
La mejor parte es que la función dada como parámetro a fakeReturn
no se llama realmente.
Probado con TypeScript 2.5.3
TypeScript 2.8 introdujo algunos tipos condicionales predefinidos, incluido el ReturnType<T>
que obtiene el tipo de retorno de un tipo de función.
const hello = () => ''World''
type Hello = ReturnType<typeof hello> // string
Este https://github.com/Microsoft/TypeScript/issues/4233#issuecomment-139978012 podría ayudar:
let r = true ? undefined : someFunction();
type ReturnType = typeof r;