172 votes

Comment déclarer les types de retour des fonctions en TypeScript ?

J'ai vérifié ici https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md qui est le Spécifications du langage TypeScript mais je n'ai pas trouvé comment je peux déclarer un type de retour de la fonction.

J'ai montré ce que j'attendais dans le code ci-dessous : greet(name:string): string {}

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

Je sais que je peux utiliser (name:string) => any mais elle est surtout utilisée pour passer des fonctions de rappel :

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

135voto

Steve Fenton Points 55265

Vous avez raison - voici un exemple qui fonctionne parfaitement - vous verrez que var result est implicitement une chaîne de caractères parce que le type de retour est spécifié dans le paramètre greet() fonction. Changez le type en number et vous obtiendrez des avertissements.

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();

Voici l'exemple du numéro - vous verrez des gribouillis rouges dans l'éditeur d'aire de jeu si vous essayez ceci :

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

41voto

Adverbly Points 485

Les types de retour utilisant la notation fléchée sont les mêmes que dans les réponses précédentes :

const sum = (a: number, b: number) : number => a + b;

35voto

Luke Points 82
functionName() : ReturnType { ... }

20voto

mohamed hegazy Points 2294

Vous pouvez en savoir plus sur les types de fonctions dans le spécification du langage dans les sections 3.5.3.5 et 3.5.5.

Le compilateur TypeScript déduit les types lorsqu'il le peut, ce qui vous évite d'avoir à spécifier des types explicites. Ainsi, pour l'exemple du greeter, greet() renvoie un littéral de chaîne de caractères, ce qui indique au compilateur que le type de la fonction est une chaîne de caractères, et qu'il n'est pas nécessaire de spécifier un type. Ainsi, par exemple, dans cet exemple, j'ai la classe greeter avec une méthode greet qui renvoie une chaîne de caractères, et une variable qui est affectée à un littéral de nombre. Le compilateur déduira les deux types et vous obtiendrez une erreur si vous essayez d'affecter une chaîne de caractères à un nombre.

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(); 

De même, cet exemple provoquera une erreur car le compilateur, étant donné l'information, n'a aucun moyen de décider du type, et ce sera un endroit où vous devrez avoir un type de retour explicite.

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

Ceci, cependant, fonctionnera :

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

7voto

C.R.B. Points 83

Déclaration de type de retour externe à utiliser avec plusieurs fonctions :

type ValidationReturnType = string | boolean;

function isEqual(number1: number, number2: number): ValidationReturnType {
    return number1 == number2 ? true : 'Numbers are not equal.';
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X