我正在尝试使用updeep
库。使用updeep
的典型示例如下:
var person = {
name: {
first: 'Jane',
last: 'West'
}
};
var result = u({ name: { first: 'Susan' } }, person);
这里的想法是result
将是person
的克隆,但name.first
的值已更改。 你可以想象这个函数u
在TypeScript中定义为:
function u<T>(changes: {}, obj: T): T { ... }
这表明第二个参数的类型也是函数的返回类型。但它没有表达出“changes”应该是“T”的超级类型的事实。
我希望第一个参数能进行一些类型检查。关键在于,出现在“changes”参数中的值都应该出现在“T”类型参数中,并且与其对应的类型相匹配。表达这一点可以让我们检查“changes”参数,以确保它针对类型“T”是合理的(即,是“T”的超级类型)。
我不确定TypeScript是否支持此功能。在Java等语言中,有“super”关键字可用于描述类型参数的约束。
虽然TypeScript不允许使用,但是类似于以下内容可以表达我的意思:
function u<T extends U,U extends {}>(changes: U, obj: T): T { ... }
有没有关于如何表达这个问题的建议?希望能够有一个类型安全的系统来执行这样的转换。
谢谢。
T
的超类型:任何T
(具有所有键)都可以分配给部分类型(其中键是可选的)。它并不是 每个 超类型,因为每个键的类型必须要么与T
中的类型相同,要么根本不存在。 - Peeja