【发布时间】:2022-01-21 17:50:51
【问题描述】:
有一个问题我一直在努力解决。
我有一个函数,里面放了两个参数:
- 类 - 类数组
- mapper - 采用这些类的实例数组的函数。
想象一下这样的功能:
const MapClasses = (classes, mapper) => {
const instances = classes.map((item) => new item())
return mapper(instances)
}
我如何为此创建一个打字稿声明,以确保 mapper 将始终接受 classes 的实例数组。
示例用法:
class Coords {
x = 10
y = 10
}
class Names {
name = 'Some Name'
}
const mapper = ([coords, names]) => {
return {
x: coords.x,
y: coords.y,
myName: names.name,
}
}
const mapped = MapClasses([Coords, Names], mapper)
// { x: 10, y: 10, myName: 'Some Name'}
所以我认为应该可以检查映射器是否访问了正确的值。
我的工作方式是这样的:
type MapClasses = <Classes, Mapped>(
classes: {
[Property in keyof Classes]: new () => Classes[Property]
},
mapper: (instances: Classes) => Mapped,
) => Mapped
但是在这种情况下,错误只显示在 classes 参数上,而不是 mapper。
那么有什么办法可以扭转这种行为吗?
....
如有任何想法,我将不胜感激。
祝你有美好的一天。
【问题讨论】:
-
我很难理解你想要做什么,但我怀疑你将能够使用像
Array.prototype.map这样的内置插件来完成你想要做的事情。如果您看起来像是在尝试对原始类而不是实例进行操作,那么 TS 会引发很多障碍。您能否详细说明您的解决方案的用途? -
this approach 是您要找的吗?如果您的问题包含您要解决的实际问题的minimal reproducible example,这将很有帮助(即错误出现在
classes而不是mapper);你能edit那个吗?如果我的解决方案适合你,我可以写一个答案;如果没有,请告诉我我缺少什么。 -
@jcalz 正是我想要的。
标签: javascript typescript typescript-typings typescript-generics typescript-class