-2

这段代码不可能失败

const fn = (obj: object) => obj?.prop;

但是 TypeScript 编译器阻止我写那个,解释说

“对象”类型上不存在属性“道具”

但这正是可选链的使用:如果属性存在,我访问它,否则我访问 undefined,它适用于任何object. 那么为什么 TS 不让我写这个,tsconfig.json我可以设置一个设置,以便我可以写那个?

4

1 回答 1

1

来自Mozilla

可选的链接运算符 (?.) 使您能够读取位于连接对象链深处的属性值,而无需检查链中的每个引用是否有效。

在您的情况下,obj是否正在检查参考nullundefined而不是 prop


那么为什么TS不让我写这个

你已经告诉 TS 期待一个object,但是你没有告诉 TS 任何关于那个对象的属性,所以它不知道是否prop存在。换句话说,propis 不在 的接口上object,因此会引发编译器错误。


我的 tsconfig.json 中是否有可以设置的设置以便我可以编写它?

上面的行为是 TypeScript 的重点,一个静态类型检查器。您不希望启用这种确切的行为,但语言中有一种预期的方式可以产生相同的效果:

const fn2 = (obj: Record<string, any>) => obj.prop;

上面的代码要求它obj是非空/未定义的,并允许任何string(或number,但不是Symbol)属性访问器。

操场

于 2021-09-07T16:58:22.570 回答