【问题标题】:How to declare Return Types for Functions in TypeScript如何在 TypeScript 中声明函数的返回类型
【发布时间】:2026-01-03 20:30:02
【问题描述】:

我在这里检查了https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md,这是TypeScript Language Specifications,但我找不到如何声明函数的返回类型。

我在下面的代码中展示了我的期望:greet(name:string): string {}

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

我知道我可以使用(name:string) => any,但这主要用于传递回调函数时:

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

【问题讨论】:

  • 您的代码正确地在您的 greet() 函数上声明了返回类型。你有什么问题?
  • 我不知道这是正确的。这是我期待看到的,而我希望看到的恰好是正确的。大声笑:)

标签: javascript typescript oop


【解决方案1】:

你是对的 - 这是一个完整的工作示例 - 你会看到 var result 是一个隐含的字符串,因为返回类型是在 greet() 函数上指定的。将类型更改为number,您将收到警告。

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

这是数字示例 - 如果您尝试以下操作,您会在操场编辑器中看到红色曲线:

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

【讨论】:

    【解决方案2】:

    您可以在 3.5.3.5 和 3.5.5 部分的 language specification 中阅读有关函数类型的更多信息。

    TypeScript 编译器将在可能的情况下推断类型,这样做您无需指定显式类型。所以对于 greeter 的例子,greet() 返回一个字符串字面量,它告诉编译器函数的类型是一个字符串,不需要指定类型。因此,例如在这个示例中,我有一个带有 greet 方法的 greeter 类,该方法返回一个字符串,以及一个分配给数字文字的变量。编译器会推断这两种类型,如果您尝试将字符串分配给数字,则会出现错误。

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

    同样,此示例将导致错误,因为编译器根据信息无法确定类型,而这将是您必须明确返回类型的地方。

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

    但是,这将起作用:

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

    【讨论】:

    • 在某些情况下,您可能有两种不同的返回类型,因此您可以使用 | (pipe) 声明所有可能的返回类型:function foo(): string|number {}
    【解决方案3】:
    functionName() : ReturnType { ... }
    

    【讨论】:

    • 嗨,如果返回类型是类型的数组,你怎么写,那是函数:Array
    • functionName() : ReturnType[] { ... } 或者 functionName() : Array { ... } (我更喜欢第一个,因为它更具可读性和简短性)
    【解决方案4】:

    使用箭头符号的返回类型与之前的答案相同:

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

    【讨论】:

      【解决方案5】:

      与多个函数一起使用的外部返回类型声明:

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

      【讨论】:

      • 类型 ValidationReturnType = string |布尔值;最好定义一些像这样的返回类型。