【发布时间】:2019-01-18 17:56:43
【问题描述】:
我想通过Array.prototype.reduce 实现一个通用的sum 方法,该方法总结了实体的特定数字属性。
sum 应该接受两个参数:
- 通用实体类型 E
- 它的一个属性限制为
number返回值
我的尝试是在这里使用conditional and mapped types:
类型定义:
type MeasureableEntityPropNames<E> =
{ [K in keyof E]: E[K] extends number ? K : never }[keyof E];
type MeasurableEntity<E> = Pick<E, MeasureableEntityPropNames<E>>;
type MyEntity = {
p1: number,
p2: string,
p3: Date,
p4: number
};
数据:
let entities: MyEntity[] = [
{ p1: 1, p2: "str", p3: new Date(), p4: 3 },
{ p1: 2, p2: "str2", p3: new Date(), p4: 1 }
]
sum 方法和调用:
const sum = <E>(elements: MeasurableEntity<E>[], prop: keyof MeasurableEntity<E>) =>
elements.reduce((acc: number, cur: MeasurableEntity<E>) => {
return acc + cur[prop]; // ERROR
}, 0);
sum<MyEntity>(entities, "p1");
错误:
运算符 '+' 不能应用于类型 'number' 和 'Pick[{ [K in keyof E]: E[K] 扩展数? K:从不; }[keyof E]]'。
类型定义有问题还是打字稿不能推断cur[prop] 是number 类型?这里要改什么?
问候
(打字稿 3.0.1)
【问题讨论】:
标签: typescript