采用任何类型及其子类型的函数

2023-12-08

我想写下面的函数

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(使用前将#替换为@)

采用任何类型及其子类型的函数 的相关文章