Como declarar tipos de retorno para funções no TypeScript


121

Marquei aqui https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md, que são as especificações da linguagem TypeScript, mas não consegui ver como posso declarar um tipo de retorno da função. Eu mostrei o que eu estava esperando no código abaixo:greet(name:string) :string {}

class Greeter {
    greeting: string;
    constructor (message: string) {
        this.greeting = message;
    }
    greet() : string{
        return "Hello, " + this.greeting;
    }
}  

Vejo que podemos usar algo, (name:string) => anymas eles são usados ​​principalmente ao transmitir funções de retorno de chamada:

function vote(candidate: string, callback: (result: string) => any) {
// ...
}

Seu código declara corretamente um tipo de retorno em sua greet()função. Qual problema você está tendo?
Peter Olson

1
Eu estava tendo que não sabia que estava correto. Era o que eu esperava ver e o que eu esperava ver estava correto. LOL :)
Tarik

Respostas:


106

Você está correto - aqui está um exemplo completo - você verá que var resulté implicitamente uma string porque o tipo de retorno é especificado na greet()função. Mude o tipo para numbere você receberá avisos.

class Greeter {
    greeting: string;
    constructor (message: string) {
        this.greeting = message;
    }
    greet() : string {
        return "Hello, " + this.greeting;
    }
} 

var greeter = new Greeter("Hi");
var result = greeter.greet();

Aqui está o exemplo numérico - você verá rabiscos vermelhos no editor de playground, se você tentar o seguinte:

greet() : number {
    return "Hello, " + this.greeting;
}

19

Você pode ler mais sobre os tipos de função na especificação de idioma nas seções 3.5.3.5 e 3.5.5.

O compilador TypeScript inferirá tipos quando possível, e isso é feito e você não precisa especificar tipos explícitos. portanto, para o exemplo greeter, greet () retorna um literal de string, que informa ao compilador que o tipo de função é uma string e não é necessário especificar um tipo. por exemplo, neste exemplo, tenho a classe greeter com um método greet que retorna uma string e uma variável atribuída ao número literal. o compilador inferirá os dois tipos e você receberá um erro se tentar atribuir uma sequência a um número.

class Greeter {
    greet() {
        return "Hello, ";  // type infered to be string
    }
} 

var x = 0; // type infered to be number

// now if you try to do this, you will get an error for incompatable types
x = new Greeter().greet(); 

Da mesma forma, esse exemplo causará um erro, já que o compilador, dada as informações, não tem como decidir o tipo, e este será um local em que você precisará ter um tipo de retorno explícito.

function foo(){
    if (true)
        return "string"; 
    else 
        return 0;
}

Isso, no entanto, funcionará:

function foo() : any{
    if (true)
        return "string"; 
    else 
        return 0;
}

2
Em alguns casos, você pode ter dois tipos diferentes de retorno para poder usar | (pipe) para declarar todo o tipo de retorno possível:function foo(): string|number {}
Snook 14/06

12
functionName() : ReturnType { ... }

Oi, como você escrevê-lo se o tipo de retorno é matriz de um tipo, isso será função: Array <ReturnType>
arte-fan-Vikram

1
functionName (): ReturnType [] {...} ou também functionName (): Array <ReturnType> {...} (eu prefiro a primeira desde mais legível e curto)
Luca C.

12

Os tipos de retorno usando a notação de seta são iguais às respostas anteriores:

const sum = (a: number, b: number) : number => a + b;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.