我正在尝试应用 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 工作原理的基本信息,但我不确定在哪里寻找这个问题。
答案 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,
{},
)