Typescript 将特性从一个对象指定给另一个对象
在将属性从一个对象复制到另一个对象时,如何让TypeScript理解所提供的键实际上属于目标对象Typescript 将特性从一个对象指定给另一个对象,typescript,Typescript,在将属性从一个对象复制到另一个对象时,如何让TypeScript理解所提供的键实际上属于目标对象 interface Example { value: number dontUpdate: string } const a: Example = { value: 1, dontUpdate: 'a' } const b: Example = { value: 2, dontUpdate: 'b' } Object.keys(b).forEach(key => { if (
interface Example {
value: number
dontUpdate: string
}
const a: Example = { value: 1, dontUpdate: 'a' }
const b: Example = { value: 2, dontUpdate: 'b' }
Object.keys(b).forEach(key => {
if (key === 'dontUpdate') return
a[key] = b[key]
// ^ Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Example'.
})
for (let key in b) {
if (key === 'dontUpdate') continue
a[key] = b[key]
// ^ Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Example'.
}
for (let key in b) {
if (b.hasOwnProperty(key) && key !== 'dontUpdate') {
a[key] = b[key]
// ^ Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Example'.
}
}
对象不能保证只具有您在界面中分配的键。接口通常是键的子集 记住,TypeScript被编译成JavaScript。JavaScript中不存在接口。对象上的任何键都将被复制,而不管界面是什么样子 这就是为什么会出现这个错误。如果要复制特定的密钥,必须对每个密钥进行测试
if(key === 'value') a[key] = b[key] // no error
否则,您可以将它们强制转换为任何类型,并了解它不仅会复制接口中的键,还会复制对象上的所有键
(a as any)[key] = (b as any)[key]
如果您只想让TypeScript编译器了解您正在访问该对象的属性,那么可以使用keyof运算符
如果要访问两个不同对象中的同一属性,要将一个对象复制到另一个对象中,仍可以通过以下方式使用keyof运算符:
接口示例{
值:数字;
dontUpdate:字符串;
有些东西:布尔;
}
常量a:Example={value:1,dontUpdate:'a',somethingElse:true}
常量b:Example={value:2,dontUpdate:'b',somethingElse:false}
constcopyprop=(源:示例,目标:示例,prop:T):void=>{
目标[prop]=源[prop];
}
Object.key(a).forEach((key)=>{
如果(键=='dontUpdate'){
返回;
}
//将属性键从对象“a”复制到对象“b”
copyProp(例如a、b、键);
})
控制台日志(b);
其中,extends-keyof表示从keyof
如果只想将一个对象复制到另一个对象中,则可以使用“扩展”操作符:
const copy={
…来源
};
如果要复制整个对象,而不复制特定属性,则可以将“展开”操作符与“解构”操作符一起使用:
const{dontUpdate,…copy}=source;
如果您只希望b
在接口示例中有键,请通过限制对象的想法来告诉编译器。键(b)
将输出:(Object.keys(b)as(keyof Example)[])。forEach(key=>…)
在forEach
中,键
将是示例的键
。因此,无论发生什么情况,您基本上都需要进行强制转换?