如何在TypeScript中声明函数的返回类型

Tar*_*rik 97 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;
    }
}  
Run Code Online (Sandbox Code Playgroud)

我看到我们可以使用一些东西,(name:string) => any但它们主要用于传递回调函数:

function vote(candidate: string, callback: (result: string) => any) {
// ...
}
Run Code Online (Sandbox Code Playgroud)

Fen*_*ton 85

你是对的 - 这是一个完全有效的例子 - 你会看到它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();
Run Code Online (Sandbox Code Playgroud)

这是数字示例 - 如果您尝试这样,您将在操场编辑器中看到红色波形:

greet() : number {
    return "Hello, " + this.greeting;
}
Run Code Online (Sandbox Code Playgroud)


moh*_*azy 16

您可以在3.5.3.5和3.5.5节中阅读语言规范中有关函数类型的更多信息.

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

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(); 
Run Code Online (Sandbox Code Playgroud)

类似地,此示例将导致错误,因为在给定信息的情况下,编译器无法确定类型,并且这将是您必须具有显式返回类型的位置.

function foo(){
    if (true)
        return "string"; 
    else 
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,这将起作用:

function foo() : any{
    if (true)
        return "string"; 
    else 
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 在某些情况下,您可能会返回两种不同的类型,因此您可以使用| (管道)以声明所有可能的返回类型:```function foo():string | number {}``` (2认同)

Luc*_* C. 10

functionName() : ReturnType { ... }
Run Code Online (Sandbox Code Playgroud)

  • functionName() : ReturnType[] { ... } 或 functionName() : Array<ReturnType> { ... } (我更喜欢第一个,因为更具可读性和简短) (3认同)

小智 9

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

type ValidationReturnType = string | boolean;

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

Run Code Online (Sandbox Code Playgroud)


Adv*_*bly 8

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

const sum = (a: number, b: number) : number => a + b;
Run Code Online (Sandbox Code Playgroud)


小智 5

函数表达式返回类型的示例是:

const testFunction = (value:string|number):string | number =>{
    return value;
}
Run Code Online (Sandbox Code Playgroud)

泛型类型 函数表达式

const foo = <T>(x: T):T => x;
Run Code Online (Sandbox Code Playgroud)