在Hack 语言类型系统中,是否存在“top”类型,也称为“any”类型,还是通用的“Object”类型?也就是说,所有类型都是子类的类型?
手册中提到了“混合”类型,它们可能相似,但没有真正解释。也有可能在某些地方简单地省略类型声明。但是,这不能在任何地方完成,例如,如果我想将某个东西声明为string
顶级类型的函数,我不清楚我是如何做到这一点的。function (string): mixed
?
在Hack 语言类型系统中,是否存在“top”类型,也称为“any”类型,还是通用的“Object”类型?也就是说,所有类型都是子类的类型?
手册中提到了“混合”类型,它们可能相似,但没有真正解释。也有可能在某些地方简单地省略类型声明。但是,这不能在任何地方完成,例如,如果我想将某个东西声明为string
顶级类型的函数,我不清楚我是如何做到这一点的。function (string): mixed
?
我是 Facebook 的 Hack 工程师。这是一个非常有见地和有趣的问题。根据您的具体情况,Hack 有几种不同的变体。
首先,我们来谈谈mixed
。它是一切的超类型。例如,这个类型检查:
<?hh // strict
function f(): mixed {
return 42;
}
mixed
但是由于它是所有事物的超类型,因此在对值的实际含义进行案例分析之前,您无法对值做太多事情,通过is_int
,instanceof
等等。下面是一个示例,说明您必须如何使用 的结果f()
:
<?hh // strict
function g(): int {
$x = f();
if (is_int($x)) {
return $x;
} else {
return 0;
}
}
“缺失注释”类型(“any”)与此有所不同。虽然mixed
是一切的超类型,但“any”与一切统一——它既是一切的超类型,又是一切的子类型。这意味着,如果您省略注释,我们将假设您知道自己在做什么,然后让它过去。例如,下面的代码类型检查写成:
<?hh
// No "strict" since we are omitting annotations
function f2() {
return 42;
}
function g2(): string {
return f2();
}
这显然是不合理的——我们只是破坏了类型系统,如果我们执行上面的代码会导致运行时类型错误——但是为了便于转换,它在部分模式下被允许。Strict 要求您对所有内容进行注释,因此如果您的所有代码都是严格的,则无法获得类型为“any”的值来以这种方式破坏类型系统。考虑一下你必须如何在严格模式下注释上面的代码:要么f2
必须返回int
,那将是一个直接的类型错误(“字符串与 int 不兼容”),或者f2
必须返回mixed
,那将是写入的类型错误(“字符串与混合不兼容”),直到您is_int
像我在前面的示例中所做的那样对 etc 进行案例分析。
希望这可以解决问题-如果您需要澄清,请在评论中告诉我,我将进行编辑。如果您有其他不严格澄清的问题,请继续将它们标记为“hacklang”,我们将确保他们得到回应!
最后:如果您不介意,您可以在令人困惑或不清楚的文档页面上按“提交文档错误”,或者可以以任何方式改进吗?理想情况下,我们希望 docs.hhvm.com 成为此类内容的一站式站点,但文档中肯定存在漏洞,我们希望像您这样聪明、热情的人能帮助指出这些漏洞。(即,我认为这些东西在文档中得到了很好的解释,但是由于您很困惑,显然情况并非如此,我们非常感谢您提供详细说明您迷路的错误报告。)