typescript 循环对象重置值

发布于 2022-09-13 00:50:48 字数 986 浏览 16 评论 0

环境是vue3 + ts

function resetForm () {
    // const INITIALFORM = {
    //   url: '',
    //   device: 'mobile',
    //   dimension: ['time', 'page'],
    // }
    for (const key in INITIALFORM) {
      type KeyType = keyof typeof INITIALFORM
      const initialValue = INITIALFORM[key as KeyType]
      //           ^ const initialValue: string | string[]
      form[key as KeyType] = initialValue
      /**
       * type KeyType = "url" | "device" | "dimension"
          不能将类型“string | string[]”分配给类型“string & string[]”。
            不能将类型“string”分配给类型“string & string[]”。
              不能将类型“string”分配给类型“string[]”
       */
    }
  }

问题1.
form[key as KeyType] = initialValue这里赋值会报错,知道initialValue as any可以处理,但,不应该这样处理吧?想知道正确的处理方式。

问题2.
const initialValue = INITIALFORM[key as KeyType]form[key as KeyType] = initialValue两处都需要key as KeyType,可以提升一次性处理么?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

私藏温柔 2022-09-20 00:50:48

stackoverflow看到了详细的解答,总结一下:

TS3.5做了大版本更新,对象元素值是联合类型时,form[key] = initialValue是不安全 的。

现有解决方案,抽取函数,使用泛型。

const INITIALFORM = {
    url: '',
    device: 'mobile',
    dimension: ['time', 'page'],
}

declare const form: typeof INITIALFORM;

function copyProp<T, K extends keyof T>(dst: T, src: T, key: K) {
    dst[key] = src[key];
}

function resetForm() {
    let key: keyof typeof INITIALFORM;
    for (key in INITIALFORM) {
        copyProp(form, INITIALFORM, key);
    }
}
桃扇骨 2022-09-20 00:50:48
let key: keyof typeof INITIALFORM;
for (key in INITIALFORM) {
  Object.assign(form, { [key]: INITIALFORM[key] })
}

试试这个

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文