>我有以下形状:
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
的键和值,因此不会引发任何错误。
您还可以使用vec
和dict
帮助程序从 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);