下面有两个函数,mergeObj 函数使用 interface 定义,copyFields 使用泛型定义;使用泛型定义的可以能正常提示出错误,而 mergeObj 不行;如果要使用 interface 实现下面泛型的功能,要如何修改?
// 泛型,多个类型参数互联约束
// target 类型要包含 source 的类型
interface Source { }
interface Target extends Source { }
function mergeObj(target:Target, source:Source): Target { for (let key in source){ target[key]=(source)[key]; } return target; }
let obj={a:1, b:2}; let obj2={c:4};
console.log(mergeObj(obj, obj2)); // 没有报错提示
function copyFields<T extends U, U>(target: T, source: U): T { for (let id in source) { target[id] = (<T>source)[id]; } return target; }
let x = { a: 1, b: 2 };
copyFields(x, { c: 10 });
1
EridanusSora 2021-05-18 23:48:28 +08:00 via Android
这个就是标准的用泛型的场景呀
|
2
jguo 2021-05-19 08:42:56 +08:00
你似乎没理解什么是 structural typing,interface Source {}等于啥也没限制
|
3
lbyo 2021-05-19 10:24:39 +08:00
|