Tenho a seguinte função:
function test(): number {
return 42;
}
Posso obter o tipo da função usando typeof
:
type t = typeof test;
Aqui, t
vai ser () => number
.
Existe uma maneira de obter o tipo de retorno da função? Eu gostaria t
de ser em number
vez de () => number
.
typescript
typescript1.8
livrar
fonte
fonte
Respostas:
EDITAR
A partir do TypeScript 2.8, isso é oficialmente possível com
ReturnType<T>
.Veja aqui os detalhes.
TypeScript é incrível!
Hack da velha escola
A resposta de Ryan não funciona mais, infelizmente. Mas eu o modifiquei com um hack que me deixou extremamente feliz. Ver:
Ele funciona convertendo false para o valor literal de true, de modo que o sistema de tipo pense que o valor de retorno é o tipo da função, mas quando você realmente executa o código, ele causa um curto-circuito em false.
TypeScript é o melhor. : D
fonte
Cannot find name 'ReturnType'
:? usando vscodeReturnType<typeof fn>
(a resposta implicaReturnType<fn>
é o suficiente).A maneira mais fácil no TypeScript 2.8:
fonte
O código abaixo funciona sem executar a função. É da biblioteca react-redux-typescript ( https://github.com/alexzywiak/react-redux-typescript/blob/master/utils/redux/typeUtils.ts )
fonte
Não há uma maneira de fazer isso (consulte https://github.com/Microsoft/TypeScript/issues/6606 para o rastreamento de item de trabalho adicionando isso).
Uma solução alternativa comum é escrever algo como:
fonte
!1
vez defalse
- typescriptlang.org/play/…Edit: Isso não é mais necessário com o TS 2.8!
ReturnType<F>
fornece o tipo de retorno. Veja a resposta aceita.Uma variante de algumas das respostas anteriores que estou usando, que funciona
strictNullChecks
e esconde um pouco a ginástica de inferência:Uso:
Ele não chamar a
getReturnType
função, mas não chamar a função original. Você poderia evitar agetReturnType
chamada usando,(false as true) && getReturnType(foo)
mas IMO, isso só torna mais confuso.Acabei de usar este método com algum regexp localizar / substituir para migrar um projeto Angular 1.x antigo que tinha ~ 1500 funções de fábrica escritas assim, originalmente em JS, e adicionei os
Foo
tipos etc para todos os usos ... incrível o código quebrado vai encontrar. :)fonte
ReturnType<F>
para obter um tipo de retorno de funções. :)test
. Essa resposta foi uma das mais úteis para apenas renomeartest
parafoo
(e, reconhecidamente, produzir um tipo de retorno mais complexo, para variar). Tanto a resposta aceita quanto seu comentário são provavelmente ótimos se você já sabe como aplicá-los ao exemplo original. (É tarde da noite aqui e não é imediatamente aparente para mim como seria a sintaxe de um exemplo ReturnType completo.)Se a função em questão for um método de uma classe definida pelo usuário, você pode usar decoradores de método em conjunto com Reflect Metadata para determinar o tipo de retorno (função de construtor) em tempo de execução (e com ela, faça o que achar necessário).
Por exemplo, você pode registrá-lo no console:
Basta ajustar esse decorador de método em um método de sua escolha e você terá a referência exata à função construtora do objeto que supostamente é retornado da chamada do método.
No entanto, existem algumas limitações notáveis para essa abordagem:
Reflect.getMetadata
,Além disso, você precisará especificar os seguintes argumentos de linha de comando para o compilador de texto digitado, porque os decoradores e os metadados refletidos são recursos experimentais no momento da redação desta postagem:
fonte
Infelizmente, não há como recuperar o tipo de retorno da função sem executá-lo. Isso ocorre porque, quando o TypeScript é compilado em JS, você perde todas as informações relacionadas ao tipo.
fonte
ReturnType<T>
foi implementado no TypeScript.Eu descobri o seguinte, que parece funcionar bem:
fonte
fn: (...args: any[]) => Z
é tudo o que você precisa.