快捷语法获取潜在未定义对象的属性

时间:2018-10-10 10:46:02

标签: typescript

我有一个category,可以是undefined。我声明一个包含其名称的变量。因此,其类型为string | undefined

我可以这样声明:

let categoryName = undefined;
if(category) {
  categoryName = category.name;
}

但是有快捷方式语法吗?我正在寻找类似的东西:

const categoryName = category?.name

4 个答案:

答案 0 :(得分:2)

否,nullish coalesce is a Stage 1 proposal和TypeScript的设计原则规定它们仅实现第3阶段的建议。因此,在提出该建议书(或类似的建议)之前,TypeScript不会具有该语法快捷方式。

答案 1 :(得分:1)

您可以使用&&运算符。如果第一个操作数为真,则&&运算符将返回第二个操作数。在这种情况下,这意味着如果category不是undefined(即真实),它将返回第二个表达式的值。如果categoryundefined,则为假,因此返回第一个操作数的值(即未定义)

let categoryName: string | undefined;
declare let category :{ name: string} | undefined
categoryName = category && category.name;

如果您只是想忽略打字稿错误,并且可以合理确定该值不能为未定义状态,则可以使用not null断言运算符

categoryName = category!.name;

答案 2 :(得分:0)

当前,不可以。但是,您想要的?.运算符位于optional-chaining proposal中,并且目前处于第1阶段。Typescript仅在被认为足够稳定的新提议时才开始实施新建议,而这些提议已被打字团队声明为{{ 3}}。

您可以使用&&运算符,如果运算符为'falsy',则返回第一个参数,否则返回第二个参数

category && category.name

但是,这对于更复杂的嵌套案例(例如

)不是很好
category && category.parentCategory && category.parentCategory.name

这会更干净

category?.parentCategory?.name

您可以使用!运算符来断言变量不是undefinednull,但这通常不是您想要的,因为您将完全覆盖类型检查器

category!.name

答案 3 :(得分:-1)

您可以尝试

const categoryName = !isUndefined(category)?.name

其中isUndefined是从

导入的
import { isUndefined } from 'util';