我在这里查看了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) {
// ...
}
答案 0 :(得分:76)
你是对的 - 这是一个完全有效的例子 - 你会看到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;
}
答案 1 :(得分:14)
您可以在3.5.3.5和3.5.5节中的language specification中阅读有关函数类型的更多信息。
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();
类似地,此示例将导致错误,因为在给定信息的情况下,编译器无法确定类型,并且这将是您必须具有显式返回类型的位置。
function foo(){
if (true)
return "string";
else
return 0;
}
然而,这将起作用:
function foo() : any{
if (true)
return "string";
else
return 0;
}
答案 2 :(得分:8)
functionName() : ReturnType { ... }
答案 3 :(得分:4)
用于多个函数的外部返回类型声明:
type ValidationReturnType = string | boolean;
function isEqual(number1: number, number2: number): ValidationReturnType {
return number1 == number2 ? true : 'Numbers are not equal.';
}
答案 4 :(得分:3)
使用箭头符号的返回类型与先前的答案相同:
const sum = (a: number, b: number) : number => a + b;