Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 将特性从一个对象指定给另一个对象_Typescript - Fatal编程技术网

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 (

在将属性从一个对象复制到另一个对象时,如何让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 (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
中,
将是示例的
。因此,无论发生什么情况,您基本上都需要进行强制转换?