如何在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) {
// ...
}
324640 次浏览

您是正确的-下面是一个完整的工作示例-您将看到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();

下面是数字示例-如果您尝试这样做,您将在Playground编辑器中看到红色曲线:

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

您可以在第3.5.3.5节和第3.5.5节的语言规范中了解更多有关函数类型的信息。

TypeScript编译器将在可能的情况下推断类型,并且在不需要指定显式类型的情况下完成此操作。因此,对于Greeter示例,greet()返回一个字符串文本,它告诉编译器函数的类型是字符串,而不需要指定类型。例如,在这个示例中,我有一个Greeter类,它有一个返回字符串的Greet方法和一个分配给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();

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

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

然而,这将起作用:

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

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

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

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

type ValidationReturnType = string | boolean;


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


TLDR;

getUserRole(name: string) {
const roles: Role[] = [{ name: 'admin' }, { name: 'admin' }]
return roles.find(role => role.name === name) || null;
}




let userRole: ReturnType<typeof getUserRole>; // as type of Role | null
function getTime(): number {
return new Date().getTime();
}

这是一个简单的例子,你可以有任何类型而不是数字,或者你甚至可以在联合类型的帮助下有多个输入和输出类型,例如:

 function testfunction(value:string | number):string | number{


return value;
}

输入值可以是字符串或数字。

输出值可以是字符串或数字。