Javascript 打字稿上写着';对象可能为空';即使我明确地设定了它

Javascript 打字稿上写着';对象可能为空';即使我明确地设定了它,javascript,typescript,Javascript,Typescript,因此我有一个接口PropertyValue,其中属性descr\u json要么是一个对象,要么是null: export interface Property { descr_json: Array<string>; descr: string; id: number; } export interface PropertyValue { descr_json: { [key: string]: string } | null; descr

因此我有一个接口
PropertyValue
,其中属性
descr\u json
要么是一个对象,要么是null:

export interface Property {
    descr_json: Array<string>;
    descr: string;
    id: number;
}

export interface PropertyValue {
    descr_json: { [key: string]: string } | null;
    descr: string | number | null;
    id?: number;
}
但是在
forEach
中,TS抱怨
propertyValue.descr\u json
可能为null,尽管我在前一行明确地将其设置为空对象

当然,我可以用一个额外的
if
语句来检查
descr\u json
实际上不是null,但这似乎是多余的,因为我已经知道这一点

我在这里遗漏了什么?

我相信您可以使用来告诉transpiler,即使它可能为空,也请将其视为绝对不为空

在需要将其视为“真的不为null”的情况下,使用非null断言运算符(感叹号)对其进行后缀

我认为transpiler并不关心您是否定义了它,它只关心类型是什么,以及它的
是否可以为null
(即数字还是字符串?)然后它的类型实际上是
string | null
number | null
,transpire将不关心您是否显式设置了它。这就是我所相信的,如果我错了,有人会纠正我

  var x : string | null = null
  var y = x.substring(0, x.length / 2); // oop! it could be null compilation error
  var y = x!.substring(0, x!.length / 2); // use of assert non null operator prevents transpilation error
另一种可能的替代方法是使用正确类型的临时对象,然后将其分配给
descr\u json

const temp: { [key: string]: string } = {};
property.descr_json.forEach(subProperty => {
  temp[subProperty] = '';
});
pValues.descr_json = temp;

descr\u-json[subperty]
因此
descr\u-json
没有提及该权利?因此,在对象上使用
.length
.forEach()
是未定义的?否,
属性。descr\u json
是一个数组:)
pValues。descr\u json
是一个对象。您显示了两个变量
属性
pValues
,但只有一个接口
属性值
,并且没有类型声明(在赋值或任何地方)。我们怎么知道如何调试它?我的错是,我假设对象具有相同的形状,因为它们具有相同的属性
descr\u json
const temp: { [key: string]: string } = {};
property.descr_json.forEach(subProperty => {
  temp[subProperty] = '';
});
pValues.descr_json = temp;