虽然我刚刚定义了一个可选参数,但TypeScrip却抛出了Object is possibly 'undefined'. ts(2532)个错误……

interface Foo {
  keyValue?: Record<string, string>
}

const a: Foo = { keyValue: { key1: 'value' } }
a.keyValue.key2 = 'value2' // Object is possibly 'undefined'. ts(2532)

const b: Foo = {}
b.keyValue = { key1: 'value' }
b.keyValue.key2 = 'value2' // Works fine

为什么a.keyValue会抛出错误,而b.keyValue不会?唯一的区别是语法略显冗长.

推荐答案

通过做: Foo,您告诉TypeScrip该变量包含的类型是exactly Foo,而在Foo中,该属性是可选的.

const a: Foo = { keyValue: { key1: 'value' } }

打字的话,有点像

declare const a: Foo;

当您说它实际上是Foo时,右侧的对象确实具有该属性的事实就丢失了,其中该属性是可选的.

但是有了

const b: Foo = {}
// at this point, b is Foo exactly
b.keyValue = { key1: 'value' }
// at this point, b is no longer exactly Foo; it also definitely has the keyValue property

该属性被赋值after,变量被声明为Foo类型--因此,TypeScrip能够看到赋值给该属性的行,并断定它确实存在.(使b的形状与原始的Foo略有不同,其中该属性是可选的).

Typescript相关问答推荐

如何从具有给定键列表的对象类型的联合中构造类型

如何在ts中使用函数重载推断参数类型

为什么在TypScript中写入typeof someArray[number]有效?

contextPaneTitleText类型的参数不能分配给remoteconfig类型的关键参数'""'''

如何在TypeScrip中使用嵌套对象中的类型映射?

具有自引用属性的接口

使用TypeScrip5强制使用方法参数类型的实验方法修饰符

从子类集合实例化类,同时保持对Typescript中静态成员的访问

TypeScrip错误:为循环中的对象属性赋值

是否可以强制静态方法将同一类型的对象返回其自己的类?

我可以使用typeof来强制执行某些字符串吗

有没有办法传递泛型类型数组,以便推断每个元素的泛型类型?

如何定义这样一个TypeScript泛型,遍历路由配置树并累积路径

在打字应用程序中使用Zod和Reaction-Hook-Forms时显示中断打字时出错

在构建Angular 应用程序时,有没有办法通过CLI传递参数?

如何创建内部和外部组件都作为props 传入的包装器组件?

如何创建一个将嵌套类属性的点表示法生成为字符串文字的类型?

在对象数组中设置值

如何通过nx找到所有受影响的项目?

如何从列表中仅 Select 一种类型?