如何在打字稿中为领域对象中的可选字段声明类型?

How to declare types for optional fields in realm objects in typescript?

假设我在架构中有以下定义:

export const ItemSchema = {
  name: 'item',
  properties: {
    _id: 'objectId',
    sku: 'string?',
    name: 'string',
    updateDatetime: 'date',
    creationDatetime: 'date',
  },
  primaryKey: '_id',
};

在这种情况下,字段 sku 是可选的。我应该如何使用打字稿在界面中声明字段?

我现在有三个选择。

将 sku 设置为可为空:

export interface Item  {
  _id: ObjectId;
  sku: string | null;
  name: string;
  updateDatetime: Date;
  creationDatetime: Date;
}

可选 sku:

export interface Item  {
  _id: ObjectId;
  sku?: string;
  name: string;
  updateDatetime: Date;
  creationDatetime: Date;
}

将 sku 设为可选且可为空:

export interface Item  {
  _id: ObjectId;
  sku?: string | null;
  name: string;
  updateDatetime: Date;
  creationDatetime: Date;
}

从我的角度来看,任何方式都基本相同,但因为我总是做更新,所以值并不意味着相同。对于此代码:

  realm.write(() => {
    realm.create<Item>('item', item, UpdateMode.Modified)
}
  1. 如果sku未定义(item中不存在该值或字段),则不会更新该值。
  2. 如果 sku 为空,则该值将设置为空。

那么,在我的应用程序中声明处理它的类型的正确方法应该是什么?

  1. If sku is undefined (the value or field doesn't exists in item), the value will not be updated.
  2. If sku is null the value will be set to null.

要使该功能正常工作,您需要该字段既可以是 undefined 也可以是 null,也可以是 string.

所以这两个行不通:

{ sku: string | null } // can't be undefined
{ sku?: string } // can't be null

这意味着您需要此表格:

{ sku?: string | null; }

?表示可以省略(在这种情况下是undefined),| null表示可以显式设置为null。

这是唯一支持以下所有内容的类型:

{} // ignore sku
{ sku: undefined } // ignore sku
{ sku: null } // write null to sku
{ sku: 'abc123' } // write string to sku