我想写下面的函数
function override<T, U>(first: T, second: U): T {
let result = <T>{};
for (let id in first) {
result[id] = first[id];
}
for (let id in second) {
result[id] = second[id];
}
return result;
}
但要使其类型安全。在我的用例中,两者T
and U
是简单的记录类型。我想T
需要具备以下所有属性U
。有没有办法表达这种关系?
你不能这样做在单个函数声明中。原因是extends
泛型约束不能引用同一组中的其他泛型。但是,您可以将该函数分成两部分(柯里化)。然后使用第一个参数的类型(现在在单独的函数中)来约束第二个参数的类型,如下所示:
var override = <T>(first:T) => <U extends T>(second:U) : T => {
let result = <T>{};
for (let id in first) {
result[id] = first[id];
}
for (let id in second) {
result[id] = second[id];
}
return result;
}
override({a:123})({a:123, b:456}); // okay
override({a:123})({b:456}); // error
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)