網站搜尋

javascript - 如何在 TypeScript 中宣告函式的回傳類型


我查看了這裡 https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md,這是 TypeScript 語言規範,但我找不到如何聲明函數的返回類型。

我在下面的程式碼中展示了我所期望的: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) {
  // ...
}

答案#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

使用箭頭符號的返回類型與之前的答案相同:

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

答案#3

functionName() : ReturnType { ... }

答案#4

你可以在語言規範的第 3.5.3.5 節和第 3.5.5 節中閱讀更多關於函數類型的內容。

TypeScript 編譯器會在可能的情況下推斷類型,所以你不需要明確指定類型。因此,在 greeter 範例中,greet() 返回一個字串字面量,這告訴編譯器函數的類型是字串,而不需要明確指定類型。例如,在這個例子中,我有一個 greeter 類別,其 greet 方法返回一個字串,並且有一個變數被分配了一個數字字面量。編譯器會推斷兩者的類型,如果你試圖將字串賦值給數字,將會得到一個錯誤。

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;
}