【问题标题】:Typescript initialize empty object打字稿初始化空对象
【发布时间】:2020-10-09 04:10:38
【问题描述】:

我正在学习打字稿,但我正在为下面的代码苦苦挣扎。

      const profile = state.currentProfile;
      type literalProfile = keyof Partial<Omit<Profile, 'id'>>;

      const values: Record<literalProfile, string | undefined> = {
        name: '',
        avatar: '',
        title: '',
        subtitle: '',
      };

      Object.entries(data).forEach((entry) => {
        const key = entry[0] as literalProfile;
        const value = entry[1];
        if (value && profile[key] !== value) {
          values[key] = value;
        }
      });

      await this.$axios.patch(`/users/profiles/${profile.id}`, values);

问题是,有没有办法像这样将值初始化为空对象?

const values: Record<literalProfile, string | undefined> = {};

因为如果我做这样的打字稿会突出显示我的错误

类型“{}”缺少类型“记录”中的以下属性':名称、标题、副标题、头像

如果我尝试这样的事情

let values: Record<literalProfile, string | undefined>;

然后打字稿说

变量“值”在被赋值之前使用。

在这一行

await this.$axios.patch(`/users/profiles/${profile.id}`, values);

所以我不知道如何解决这个问题,有什么想法吗?

【问题讨论】:

  • 空对象不是该类型的有效值,因为它缺少必需的属性。也许你想要Partial&lt;Record&lt;literalProfile, string&gt;&gt;?还是 type assertion 在初始化对象时暂时向编译器谎报对象的类型?无论哪种方式,我都希望在这里看到一个适合放入独立 IDE 的 minimal reproducible example,例如 The TypeScript Playground 来为我自己演示这个问题。一个没有 axios 的独立玩具示例会很好。
  • Playground Link 您的 Partial 解决方案效果很好,我不知道为什么我没有意识到这个解决方案。尽管如此,我想知道打字稿开发人员中更常见的解决方案是什么,您的解决方案或@wex 解决方案。还是谢谢!

标签: typescript


【解决方案1】:

目前,您使用的是Record&lt;listeralProfile, string | undefined&gt;

您应该使用{ [key in literalProfile]?: string }

有细微的差别。两者都支持将undefined 作为值,但通过使用可选字段关键字?,您可以在初始化对象时省略这些字段。

const values: { [key in literalProfile]?: string } = {};

【讨论】:

  • 您的解决方案按预期工作,但我想知道在哪里可以阅读@jcalz 提到的您的解决方案和部分解决方案的区别。提前致谢。
  • Partial 中包装您的对象基本上会为每个字段添加可选关键字。你可以在这里阅读更多:typescriptlang.org/docs/handbook/utility-types.html#partialtype
  • 在你的情况下,它实际上不应该对你使用产生影响,因为每个字段都可能是一个 undefined 值。
猜你喜欢
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
  • 2017-09-06
  • 2021-07-24
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 2018-08-14
相关资源
最近更新 更多