【问题标题】:How to create a TypeScript object with only selected properties?如何创建仅具有选定属性的 TypeScript 对象?
【发布时间】:2021-03-30 04:02:02
【问题描述】:

我有一个如下所示的 TypeScript 对象:

class User {
  id: string = "";
  location: string = "";
  displayName: string = "";
  otherAttribute: string = "";
}

如何创建一个用户类型的对象,只包含我想要的字段?

例如,我希望能够创建一个用户对象,它只包含 iddisplayName,但没有 location 和 otherAttribute 属性。我需要创建一个没有不需要的属性的新对象来使用 DynamoDB DataMapper,它是一个与 DynamoDB 接口并使用类属性动态映射到 DynamoDB 表属性的 ORM 库。这在使用纯 JavaScript 之前运行良好,因为我没有在我的 JavaScript User 类中声明任何属性,但现在需要为 TypeScript 声明。有没有办法解决这个问题?

【问题讨论】:

  • 你的界面在哪里?
  • 为什么不在 location 和 otherAttribute 字段中创建一个具有空值的对象,然后使用 delete 将它们删除?
  • 这能回答你的问题吗? Optional property class in typescript
  • @RandyCasburn 不完全是因为可选与否,创建对象时,该对象的属性仍然存在。
  • @RandyCasburn 与其说是“逆流而上”,不如说是试图找到解决实际问题的方法。我使用的是专为 JavaScript 而不是 TypeScript 设计的库 (AWS DynamoDB DataMapper)。

标签: javascript typescript amazon-dynamodb


【解决方案1】:

据我了解,您只需要创建一个 User 类型的实例,并且只具有某些属性。

您可以通过多种方式做到这一点。最直接的方法是使用 TypeScript 中的 PickOmit 实用程序,如下所示:

const cherryPickedInstance: Pick<User, "id" | "displayName"> = {
  "id": "123",
  "displayName": "Oliver" 
};

// or make use of Omit
const omittedInstance: Omit<User, "otherAttribute" | "location"> = {
  "id": "1234",
  "displayName": "Sam" 
};

[编辑] 我没有完全理解你的要求。但是,如果您只想将部分属性设置为部分属性并保持User 中的其余属性不变,请使用Optional 实用程序,如下所示:

type Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>;

然后你可以像这样设置你的类,所有属性默认为Partial

class User {
  id: string = "";
  location: string = "";
  displayName: string = "";
  otherAttribute: string = "";

    public constructor(
        fields?: {
          id?: string;
          location?: string;
          displayName?: string;
          otherAttribute?: string;
        }) {
        if (fields) Object.assign(this, fields);
    }
}

const optionalCLassInstnace: Optional<User, "location" | "otherAttribute"> = new User({
  "id": "1", 
  "displayName": "Optional"
});

【讨论】:

  • 感谢您的建议。我使用 Pick (typescriptlang.org/docs/handbook/utility-types.html) 进行了尝试,但它创建了一个新类型,而不是保留原始用户类型。当我按照您在答案中建议的那样构造对象时,cherryPickedInstance 只是一个对象文字,而不是 User 对象。
  • @Bryan 请参考我的编辑。我希望这是你想要的。
猜你喜欢
  • 2021-09-03
  • 2023-01-12
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 2019-12-28
相关资源
最近更新 更多