在无类型语言中,运行时断言可以捕获“类型错误”:
<?php
function add_one($x) {
assert(is_int($x));
return $x+1;
}
?>
使用Hack的类型注释,我想删除断言,但这是不安全的,因为无类型代码仍然可以调用类型函数。
<?hh // strict
function add_one(int $x): int {
return $x+1;
}
function evil(): void {
// UNSAFE
add_one("yes"); // Runtime error!
}
?>
对于任何专业的Hack开发人员:您是否使用断言强制执行类型签名? (我真的很想知道Facebook的政策是什么,但我知道这是不是秘密。)
答案 0 :(得分:2)
在运行时未能满足类型签名会引发E_RECOVERABLE_ERROR
。你如何处理这个问题取决于你的错误处理程序。
建议使用assert
,因为它是eval
的配置控制版本。相反,Hack引入了invariant
函数,您可以使用该函数向类型检查器提供信息,您知道它是真实的,但它无法弄清楚。始终在运行时检查对invariant
的调用,如果失败则会抛出异常。
因此,在您的示例中,我不会进行任何其他检查,因为add_one("yes");
调用在运行时已经导致错误。