如何在 hacklang 中定义空的字典<string, int>



>我有以下形状:

const type A = shape(
'b' => dict<string, int>,
);

如何使用空字典创建此形状?例如,从这个函数

function getA(): A {
return shape(
'b' => ???
);
}

不知道我使用了什么语言功能,但这可以解决问题。

function getA(): A {
return shape(
'b' => dict[]
);
}

如果有人有更多上下文,请添加您的答案我会接受

这是 Hack 数组提案的一部分

dict 数组是将有效数组键映射到值的容器。这 镜像 Map 类的行为。这将是一个数组 运行时具有额外的限制,允许它像 从类型检查器的角度进行映射。这主要集中在 所需的运行时行为,但如果对它将如何存在疑问 与类型检查器交互,我很乐意讨论。字面 构造 函数

字典是使用文字表达式 dict[] 构造的。

$dict = dict[]; // Empty dict-array
$dict = dict['a' => 1, 'b' => 2, 'c' => 3]; // dict-array of 3 elements

这是一个静态表达式,因此可以在静态表达式中使用 初始 化。

class C {
public static dict<string, int> $dict = dict[
'a' => 1,
'b' => 2,
'c' => 3,
];
}

来源 : https://github.com/facebook/hhvm/issues/6452

创建字典 (dict[]( 或向量 (vec[]( 时不需要定义类型,因为在运行时会忽略泛型

例:

function spamMessages(dict<string, string> $messages): void
{
foreach($messages as $user => $message) {
echo $user . ': ' . $message;
}
}
function listUsers(vec<string> $users): void
{
foreach($users as $user) {
echo '-' . $user;
}
}
$messages = dict[
'azjezz' => 'bring the cookies'
];
$users = vec[
'azjezz'
];
spamMessages($messages);
listUsers($users);

在此示例中,类型检查器足够智能,可以看到$message同时具有类型string的键和值,因此不会引发任何错误。

您还可以使用vecdict帮助程序从 php 样式数组创建字典数组或向量

$array = [
'a' => 1,
'b' => 'c'
];
$dict = dict($array);

在上面的例子中,类型检查器知道$array中键的类型,并且由于dict帮助程序被声明为dict<Tk, Tv>(KeyedTraversable<Tk, Tv> $array): dict<Tk, Tv>它知道返回的字典数组包含键和值的相同类型。

有时,您可能无法告诉类型检查器数组键和值的类型。

例:

$array = json_decode('path/to/file.json');

例如,您知道 json 文件包含字符串键和值的数组,但这里的类型检查器认为$array属于mixed类型,因为无法实际判断文件中的内容。

为了克服这个问题,您可以使用as运算符告诉类型检查器有关$array类型

$array = json_decode('path/to/file.json') as array<_, _>;

请注意,这里我们使用_而不是string,它们的类型检查器将假定$array现在是array<arraykey, mixed>类型,原因是目前as运算符不支持泛型,但将来可能会更改,因此我们可以做as array<string, string>

稍后您可以从该数组中创建一个字典:

$dict = dict($array);

例如,如果您知道该文件无法在字符串键和值之外包含任何内容,并且想要强制该类型,则可以使用以下帮助程序将其转换为类型dict<string, string>的字典,但我不推荐它,因为它可能会导致错误non-stringable将对象或资源转换为字符串。

// KeyedContainer = array, dict, maps and other keyed containers 
function forceStringDict(KeyedContainer<arraykey, mixed> $container): dict<string, string>
{
$dict = dict[];
foreach($container as $k => $v) {
$dict[(string) $k] = (string) $v;
}
return $dict;
}
$dict = forceStringDict($dict);

相关内容

  • 没有找到相关文章

最新更新