关于typescript遍历对象时,通过key-value形式赋值类型问题?

// n 和 addOrEditOptions都有可选属性,n包含addOrEditOptions所有属性
rowDataChange(this: this, n: AddOrEditProductOptions) {
  if (window.JSON.stringify(n) !== '{}') {
      for (const key in this.addOrEditOptions) {
          const k = key as keyof AddOrEditProductOptions //如何优雅的给key定义类型?
          const value = n[k]
          if (value) {
              this.addOrEditOptions[k] = value // error: Type 'string' is not assignable to type 'never'.
          }
      }
   }
   //...
}
  1. 遍历对象时,如何给key定义类型?
  2. 通过key value 赋值,提示this.addOrEditOptions[k] 为never类型,如何解决?此处n 和 this.addOrEditOptions是同一个类型
    目前我是通过this.addOrEditOptions[k] = value as never 取巧解决的

回复IanSun:回复IanSun

阅读 4.6k
2 个回答

没看明白你这是要干啥?为啥要定义类型?

for (const key in this.addOrEditOptions) {
   n[key] && (this.addOrEditOptions[key] = n[key]);
}

直接赋值不就好了?还定义了一个中间变量 k 是要干啥的?

甚至于你这种合并两个对象的,用 Object.assign 不就好了?

interface AddOrEditProductOptions {}

class Example {
    private addOrEditOptions: AddOrEditProductOptions = {}

    public rowDataChange<T extends AddOrEditProductOptions> (n: T) {
        const { addOrEditOptions } = this;

        let key: keyof T;
        for (key in n) {
            if (addOrEditOptions.hasOwnProperty(key)) {
                addOrEditOptions[key as keyof AddOrEditProductOptions] = n[key as keyof AddOrEditProductOptions];
            }
        }
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题