【发布时间】:2019-07-11 07:15:35
【问题描述】:
我有一个如下所示的数据集合:
interface Item {
name: "one" | "two";
data: string;
}
const namedItems: Item[] = [
{
name: "one",
data: "some data one",
},
{
name: "two",
data: "some data two",
},
];
每个项目都有一个名称,值可以是“一”或“二”。
然后在此运行一个数组查找:
const getData = (query: "one" | "two") =>
namedItems.find((item): boolean => query === item.name).data;
引发打字稿错误“对象可能是'未定义'”。这似乎是因为 find 可能找不到某些东西,但在我的示例中,您只能查找总是返回结果的“一个”或“两个”。
我如何让 typescript 知道它总是会在查找中返回结果?
【问题讨论】:
-
(这很难看,但应该可以)尝试投射它?
-
find可能无法成功找到任何内容,在这种情况下,.data将无效。如果您将结果分配给类型化变量,那么它可能应该假设它始终有效 -
或者更好的是,做一些防御性编程并做处理未定义的情况:)
-
编译器无法轻松地为您验证这一点,因为
find()返回可能为空的结果。但是如果你确定它不能为空,你可以通过non-null assertion operator...namedItems.find(predicate)!.data -
你确定集合总是包含可能的值吗?容器是否总是正好包含两个元素,或者它可以更少或更多?如果总是有两个元素,你知道它们都有唯一的名称吗?
标签: typescript