Javascript 如何将分解分配和可选链接结合起来?

Javascript 如何将分解分配和可选链接结合起来?,javascript,typescript,optional-chaining,Javascript,Typescript,Optional Chaining,我有一个TypeScript接口,带有一些可选字段和该类型的变量: interface Foo { config?: { longFieldName?: string; } } declare let f: Foo; 我想把longFieldName放在一个同名变量中 如果config不是可选的,我会在不重复longFieldName的情况下使用它。但确实如此,所以我得到了一个类型错误: const { longFieldName } = f.config;

我有一个TypeScript接口,带有一些可选字段和该类型的变量:

interface Foo {
    config?: {
        longFieldName?: string;
    }
}

declare let f: Foo;
我想把
longFieldName
放在一个同名变量中

如果
config
不是可选的,我会在不重复
longFieldName
的情况下使用它。但确实如此,所以我得到了一个类型错误:

const { longFieldName } = f.config;
     // ~~~~~~~~~~~~~  Property 'longFieldName' does not exist on type '{ longFieldName?: string | undefined; } | undefined'.
我可以使用来简洁地处理
未定义的情况:

const longFieldName = f?.config.longFieldName;  // OK, type is string | undefined
但现在我必须重复一下
longFieldName

我能吃我的蛋糕吗?我是否可以使用可选链接来处理
未定义的
案例,而不重复
longFieldName
?如果不是,最简洁/惯用的解决方法是什么?如果
f?.config
表达式的计算结果为
未定义
,请参见。

用于获取回退值(空对象):

const { longFieldName } = f?.config || {};

您可以使用默认值

constfoo={}
const{config:{longFieldName=”“}={}}}=Foo
console.log(longFieldName)/''

这就是解决办法。但是有什么更类似于可选链接吗?(我认为您不希望在
longFieldName
之前使用
..
..
是多余的。据我所知,可选链接无法处理回退。
..
是另一个解决方案的遗留问题-将
f?.config
扩展到对象
{…f?.config}
。如果链接计算结果为
未定义
,则排列将忽略它们。这对我不起作用。我得到的
undefined不是一个对象(计算'\u ref2.longFieldName')
。对于右侧的一个属性,也可以这样做:
const{longFieldName=”“}=f??{}
,带有可选的(如我插入的)回退值当前不在ecma t39的范围内:如果缺少
config
,则此选项有效,但如果添加另一个同样缺少的中间级别,则此选项将不起作用。