无法使用 Object.entries 分配值

时间:2021-04-06 14:46:48

标签: typescript

我正在尝试应用 reduce 来构造与输入类型相同的新对象。似乎 Typescript 不允许通过 reduce 构造相同的对象,但我不确定如何在 Typescript 中使其工作。

功能是过滤掉对象内的空字符串。 acc[key] = value; 的赋值似乎不起作用,因为 Typescript 不知道 value 是否可以赋值给 acc[key],因为 acc 可以包含多种类型 (string | boolean | undefined)。仅使用一种类型就可以完成这项工作。赋值时出现如下错误:

<块引用>

类型“字符串”不可分配给类型“未定义”。(2322)

following snippet 提出了问题:

type MultipleTypesObject = {
  foo?: string;
  bar?: boolean;
};
var value: MultipleTypesObject = {
  foo: 'test',
};

const strictEntries = Object.entries(value) as [Extract<keyof MultipleTypesObject, string>, MultipleTypesObject[keyof MultipleTypesObject]][]
const result = strictEntries.reduce((acc, [key, value]) => {
  if(typeof value === 'string' && value.trim().length > 0) {
    acc[key] = value
  }
  return acc;
}, {} as MultipleTypesObject);

我觉得我缺少一些关于 Typescript 工作原理的基本信息,但我不确定在哪里寻找这个问题。

1 个答案:

答案 0 :(得分:0)

累加器的类型必须有注释,否则会被推断为{},不需要不安全的类型转换。

interface MultipleTypesObject {
  foo?: string
  bar?: boolean
}

const value: MultipleTypesObject = {
  foo: 'test',
}

const result = Object.entries(value).reduce(
  (acc: Partial<MultipleTypesObject>, [key, value]) =>
    typeof value === 'string' && value.trim().length > 0
      ? { ...acc, [key]: value }
      : acc,
  {},
)
相关问题