【发布时间】:2020-03-17 19:13:03
【问题描述】:
一般 Typescript 问题说我迭代了一个我知道其内容的数组并应用 reduce 来获取一个我知道类型的对象 例如:
interface IMyInterface {
a: number;
b: number;
c: number;
}
const result: IMyInterface = ['a','b','c'].reduce((acc: Partial<IMyInterface>,val)=>({...acc,[val]: 1}), {});
现在这行不通了,因为结果应该是Partial<IMyInterface>,这是有道理的,考虑到 TS 不能告诉数组的内容将产生“完整”对象。
但是我需要做什么才能使结果可以是 IMyInterface 类型而不需要 as IMyInterface ?
这是一个回复https://repl.it/@Sudakatux/KaleidoscopicGraciousApplicationpackage
提前致谢
【问题讨论】:
-
与
reduce()?没有什么比类型断言更好的了。为了使它起作用,回调需要是通用的<K extends keyof IMyInterface, T extends Partial<IMyInterface>>(acc: T, val: K): T & Record<K, number> => ...,但是类型系统缺乏表达为元组类型["a","b","c"]的每个元素指定T和K的高阶操作的能力. -
你可以unroll它,但不能循环或
reduce()。 -
@jcalz 我不明白这有什么关系。对不起。在展开示例中,有一个转换为 any,然后转换为从 any 到 Record
-
这不是 important 的展开示例,抱歉
-
这里有更多analogous unrolled example。这很有效,但这只是因为编译器认为每个步骤都是单独发生的。
标签: typescript