我认为最接近规范答案的就是 GitHub 问题 microsoft/TypeScript#13152 和 microsoft/TypeScript#3081。情况的要点是这样的:
在函数类型中支持参数名称作为库中函数和方法的文档很有用。函数类型(username: string, password: string) => void 与(arg0: string, arg1: string) => void 的类型相同,但前者可能比后者更能帮助开发人员编写代码。因此,旨在支持函数类型中的类型注释参数名称,并记录在(越来越过时的)TypeScript spec 中,并在各地的库中使用。 In the words of one of the language maintainers:
我...相信它有助于文档。以我所拥有的能力使用 Haskell 之后,我会说省略参数名称......在学习新库时对任何人都没有帮助。虽然对于更简单的语法有一些话要说,但类型是人们唯一的文档形式,这常常让人难以理解意图......
此外,在 TypeScript 支持命名值的类型注释的情况下,类型可以省略,它们将由编译器推断。未能推断出任何有用的结果会导致推断any。例如,在以下函数中:
function f(x, y): void { }
type F = typeof f;
// type F = (x: any, y: any) => void
x 和 y 的类型被推断为 any(你会得到一个很好的错误 --noImplicitAny compiler option)。与以下注释版本相同:
function g(x: any, y: any): void { }
type G = typeof g;
// type G = (x: any, y: any) => void
对f 和g 本身的类型签名应用相同的规则会导致以下行为:
type Fprime = (x, y) => void; // --noImplicitAny yells at you here
// type Fprime = (x: any, y: any) => void
type Gprime = (x: any, y: any) => void;
// type Gprime = (x: any, y: any) => void
所以当您编写(x, y) => void 时,编译器会将x 和y 解释为名称,而不是类型。由于类型可以省略,参数名称不能。我认为没有人喜欢这个,但这种方式已经存在很长时间了,以至于它是apparently used in libraries,所以改变它会破坏现实世界的代码。来自上面引用的相同评论:
我认为做出这种改变为时已晚。由于当前的行为,将单个标识符解释为类型将是一项重大更改。
所以这就是这个问题的可悲答案。也许如果他们能及时回到过去,他们会让参数名称是可选的并且类型是必需的,以更接近于类型理论符号,但现在这是我们坚持的。
希望有所帮助;祝你好运!
Playground link to code