首页 > 解决方案 > 如何在打字稿中为领域对象中的可选字段声明类型?

问题描述

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

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;
}

从我的角度来看,任何做这件事的方式基本上都是一样的,但是因为我总是做 upserts,所以这些值并不意味着相同。对于此代码:

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

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

标签: reactjstypescriptreact-nativerealm

解决方案


  1. 如果 sku 未定义(item 中不存在值或字段),则不会更新该值。
  2. 如果 sku 为 null,则该值将设置为 null。

要使该功能起作用,您需要该字段既可以是undefinedor null,也可以是string

所以这两个不起作用:

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

这意味着你需要这个表格:

{ sku?: string | null; }

?说它可以被省略(在这种情况下它是)undefined,并且| null说它可以显式设置为空。

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

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

推荐阅读