我在这里检查了 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()
函数上正确声明了返回类型。你有什么问题?
你是对的 - 这是一个完整的示例 - 你会看到 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;
}
使用箭头符号的返回类型与以前的答案相同:
const sum = (a: number, b: number) : number => a + b;
functionName() : ReturnType { ... }
您可以在第 3.5.3.5 节和第 3.5.5 节中的 language specification 中阅读有关函数类型的更多信息。
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;
}
function foo(): string|number {}
与多个函数一起使用的外部返回类型声明:
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
getUserRole
,其返回类型未在此处声明。这仅显示返回类型推断。你能编辑这个答案来解释它是如何回答这个问题的吗?