swagger-api / swagger-codegen生成以下代码:
private extendObj<T1,T2>(objA: T1, objB: T2) {
for(let key in objB){
if(objB.hasOwnProperty(key)){
objA[key] = objB[key];
}
}
return <T1&T2>objA;
}
在编译时产生错误:
TS2536:类型'keyof T2'不能用于索引类型'T1'
有人可以解释为什么一个对象的密钥不能用于访问另一个对象场吗?关键是推断出某种特殊类型吗?
在typescript中复制对象属性的正确方法是什么?
答案 0 :(得分:4)
我通过交叉类型&lt; T1&amp; T2取代。 https://www.typescriptlang.org/docs/handbook/advanced-types.html
/** Extends objA with properties of objB and returns objA */
function extendObj<T1, T2>(objA: T1, objB: T2): T1 & T2 {
for (let key in objB) {
if (objB.hasOwnProperty(key)) {
(<T1 & T2>objA)[key] = (<T1 & T2>objB)[key];
}
}
return <T1 & T2>objA;
}
/** Creates an object with the specified prototype and properties coming from object (cloned) */
function fromPrototype<T, A>(prototype: T, object: A): T & A {
// Create the object with the specified prototype
const newObject = <T & A>Object.create(prototype);
// Clones properties of the specified object
for (const prop in object) {
if (object.hasOwnProperty(prop)) {
newObject[prop] = (<T & A>object)[prop];
}
}
return newObject;
}
答案 1 :(得分:3)
我认为正确的函数应该看起来like this:
function extendObj<T1,T2>(objA: T1|T2, objB: T2): T1|T2 {
for(let key in objB){
if(objB.hasOwnProperty(key)){
objA[key] = objB[key];
}
}
return objA;
}
返回的类型应该是T1
和T2
(|
)的并集,而不是交集(&
)。
也许您不熟悉keyof
这是TypeScript 2.1中的新功能。
我认为编译器的推理是它知道key
是T2
的有效成员,但它不知道T1
这就是为什么我说{{1} }}是objA
和T1
的联合(它不是真的,但我想分配给T2
字段)。编译器不区分读写。
我不熟悉swagger-codegen,你对生成的代码有任何控制权,或者你能编辑它吗?